OpenMP条件关键

时间:2017-10-20 13:20:05

标签: c++ multithreading openmp

首先,请记住,我不是OpenMP的常用用户......好吗?

既然我们已经过去了,那么有条件ENV吗? 我对并行critical循环中的这一行特别感兴趣:

for

我想拥有它(...) #pragma omp critical myMapOfVectors[i].push_back(someNumber); (...) 当且仅当运行此特定行的线程具有相同的critical时(因为我一直在体验 - 并且请更正我在这里,如果我错了 - 多个线程推回到同一个i不是线程安全的,可能会导致vector

1 个答案:

答案 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副本,那么您可以获得更好的性能合并后来)。