C OpenMP 並行For 循環:std::vector 的替代品
std::vector 是一種通用的資料結構,通常用於平行計算使用OpenMP 迴圈。但是,在某些情況下,替代方案可能更合適,特別是在優先考慮速度或在循環期間遇到調整大小問題時。
共享資料結構的一個選項是使用 OpenMP 4.0 的自訂縮減。 's #pragma omp 聲明減少。這減少了對關鍵部分的需求並簡化了平行程式碼。
保留順序的另一種替代方法是使用帶有有序部分的靜態調度。這可以確保每個執行緒按順序寫入向量的特定部分,從而無需稍後合併。
在需要調整大小的場景中,使用指標數組來追蹤線程的方法- 可以採用特定的前綴和。這種方法避免了在關鍵路徑上調整大小的開銷。
以下是這些替代方案的程式碼範例:// Custom reduction #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);
// Static scheduling with ordered sections std::vector<int> vec; #pragma omp parallel { int ithread = omp_get_thread_num(); int nthreads = omp_get_num_threads(); #pragma omp single { prefix = new size_t[nthreads + 1]; prefix[0] = 0; } std::vector<int> vec_private; #pragma omp for schedule(static) nowait for (int i = 0; i < 100; i++) { vec_private.push_back(i); } prefix[ithread + 1] = vec_private.size(); #pragma omp barrier #pragma omp single { for (int i = 1; i < (nthreads + 1); i++) prefix[i] += prefix[i - 1]; vec.resize(vec.size() + prefix[nthreads]); } std::copy(vec_private.begin(), vec_private.end(), vec.begin() + prefix[ithread]); } delete[] prefix;
以上是C OpenMP 並行 For 迴圈中 std::vector 的替代方案是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!