首先,请记住,我不是OpenMP的常用用户......好吗?
既然我们已经过去了,那么有条件ENV
吗?
我对并行critical
循环中的这一行特别感兴趣:
for
我想拥有它(...)
#pragma omp critical
myMapOfVectors[i].push_back(someNumber);
(...)
当且仅当运行此特定行的线程具有相同的critical
时(因为我一直在体验 - 并且请更正我在这里,如果我错了 - 多个线程推回到同一个i
不是线程安全的,可能会导致vector
。
答案 0 :(得分:0)
您需要的是为每个索引select *
from your_data
order by coalesce(AttID, ID), id
设置lock。
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
副本,那么您可以获得更好的性能合并后来)。