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