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中文網其他相關文章!