OpenMP和不同的STL向量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenMP和不同的STL向量相关的知识,希望对你有一定的参考价值。

这样安全吗?或者我们需要取消注释“关键”的实用主义?

std::vector< std::vector<int> > vv(10);
#pragma omp parallel for
for (int i=0; i<10; ++i)
    for (int j=0; j<100; ++j)
        // Should we uncomment the following pragma?
        // #pragma omp critical
        vv[i].push_back(j);
答案

给定的代码是安全的,因为所有线程都将在vv的不同元素上运行。 std::vector是弱线程安全的,因为你可以根据需要在不同的向量上同时操作。

另一答案

简短的回答

简短的回答:不要退缩,没有关键部分是安全的

答案很长

不需要关键部分,因为echo线程被赋予for循环的唯一迭代子集(您可以应用不同的策略来分发它们)。对你来说重要的是没有竞争条件,当在同一个向量上添加元素时(push_back本身不是线程安全的)。

在你的情况下,每个线程总是只访问它自己的向量集,所以两个线程没有机会写相同的vector

以上是关于OpenMP和不同的STL向量的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 中的同步

在混合 MPI/OpenMP 中进行 MPI 调用的线程

在更好的优化标志和OpenMP之后,向量的计算变得更慢。

OpenMP 矩阵向量乘法仅在一个线程上执行

C ++ OpenMP在矩阵向量产品上的工作速度非常慢

c++ openmp中的线程