[英]OpenMP conditional critical
首先,請記住,我不是 OpenMP 的頻繁用戶... 好嗎?
既然我們已經過去了,是否有條件critical
之類的東西?
我對並行化for
循環中的這一行特別感興趣:
(...)
#pragma omp critical
myMapOfVectors[i].push_back(someNumber);
(...)
當且僅當運行此特定行的線程具有相同的i
時,我希望它critical
(因為正如我所經歷的那樣——如果我錯了,請在這里糾正我——多個線程推回同一個vector
不是線程安全,可能會導致segfault
)。
您需要為每個索引i
鎖定 。
// before you parallel region
std::vector<omp_lock_t> myLocks(myMapOfVectors.size());
for (size_t i = 0; i < myLocks.size(); ++i) {
omp_init_lock(myLocks+i);
}
...
omp_set_lock(myLocks[i]);
myMapOfVectors[i].push_back(someNumber);
omp_unset_lock(myLocks[i]);
...
// after your parallel region
for (size_t i = 0; i < myLocks.size(); ++i) {
omp_destroy_lock(myLocks+i);
}
關鍵部分本質上只是一個鎖,通過擁有多個鎖,您實際上是在為每個索引模擬一個單獨的關鍵部分。
請記住,鎖定可能會非常慢(尤其是發生碰撞時)。 如果您可以提前分區工作,則可能會獲得更好的性能(即,每個線程在一組不同的索引i
,或者每個線程都有自己的myMapOfVectors
副本, myMapOfVectors
再進行組合)。
在這里<\/a>查看我的答案。 您可以派生 std::vector 類來實現合適的 atomic_push_back 方法。
您的示例代碼可以寫成
std::vector<omp_vector<...>> myMapOfVectors;
(...)
myMapOfVectors[i].atomic_push_back(someNumber);
(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.