簡體   English   中英

OpenMP 條件臨界

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM