首頁 >後端開發 >C++ >OpenMP 並行 For 迴圈中「std::vector」的最佳替代品是什麼?

OpenMP 並行 For 迴圈中「std::vector」的最佳替代品是什麼?

Susan Sarandon
Susan Sarandon原創
2024-12-05 12:30:11822瀏覽

What are the Best Alternatives to `std::vector` in OpenMP Parallel For Loops?

C OpenMP 並行For 循環:std::vector 的替代品

OpenMP 的平行for 循環提供了一種並行化程式碼的便捷方法。然而,在這些循環中使用共享資料結​​構可能會引入效能瓶頸。一種常用的資料結構 std::vector 可能不是並行循環中共享使用的最佳選擇。

std::vector 的替代品

For並行for 循環中的最佳效能和執行緒安全性,請考慮以下替代方案std::vector:

具有使用者定義縮減的std::vector

OpenMP 4.0 引入了使用者定義縮減,可讓您為自訂資料定義自訂縮減操作結構。這種方法可以透過避免鎖定共享資料的開銷來提高效能。

範例:

#pragma omp declare reduction(merge : std::vector<int> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))

std::vector<int> vec;
#pragma omp parallel for reduction(merge: vec)
for (int i = 0; i < 100; i++) vec.push_back(i);

有序向量

如果共享向量中元素的順序至關重要,請考慮以下因素方法:

std::vector<int> vec;
#pragma omp parallel
{
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < N; i++) vec_private.push_back(i);

    #pragma omp for schedule(static) ordered
    for (int i = 0; i < omp_get_num_threads(); i++) {
        #pragma omp ordered
        vec.insert(vec.end(), vec_private.begin(), vec_private.end());
    }
}

自訂並行向量類別

對於複雜的共享資料結​​構,您可能需要實作自訂並行向量類別來在循環期間處理大小調整,同時確保執行緒安全高效效能。

範例:

class ParallelVector {
private:
    std::vector<int> data;
    std::atomic<size_t> size;

public:
    void push_back(int value) {
        size++;
        data.push_back(value);
    }

    size_t getSize() {
        return size.load();
    }
};

ParallelVector vec;

#pragma omp parallel
{
    #pragma omp for
    for (int i = 0; i < 100; i++) vec.push_back(i);
}

std::vector 替代方案的選擇取決於平行循環的特定要求。考慮線程安全、效能和易於實施等因素,為您的應用程式選擇最合適的解決方案。

以上是OpenMP 並行 For 迴圈中「std::vector」的最佳替代品是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn