繁体   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