这是我的代码:

main.cpp

#include <header.h>
#include <Eigen/Dense>

int main{

    int result(100);
    VectR M(100) = something; // VectR defined in header.h
    VectR N(100) = something else;

    #pragma omp parallel private(var,i,R) shared(M,N,result)
    {
        #pragma omp for
        for(int i = 0 ; i < 100 ; ++i){
            result(i) = somefunction(M,N(i));
        }
    }
}


在另一个文件中定义的somefunction将需要读取(但不写入)整个向量M

header.h:

#include <Eigen/Dense>
using namespace Eigen;

typedef double REAL;
typedef Eigen::Matrix<REAL, Eigen::Dynamic, 1> VectR;

int somefunction(const VectorR&, const VectorR&)


如何避免多个线程同时访问Msomefunction的给定元素?一些想法:


我可以/应该直接将#pragma omp criticalatomic指令直接放在读取M的somefunction文件中吗?
我最初的想法是通过M指令中的子句firstprivate(M)为每个线程提供其自己的parallel完整副本。但是,编译时出现以下错误:

main.cpp: In function âint somefunction(const VectorR&, const VectorR&)â:

main.cpp:xx: error: âMâ has reference type for âfirstprivateâ

最佳答案

问题是什么?使用OpenMP会比没有获得更差的性能吗? OpenMP有开销,因此如果somefunction快速并且您仅运行100个以上的元素,则OpenMP可能会带来较差的性能。

我看不到每个访问M的线程都有问题。只要somefucntion不写M或N(仅从它们读取),就应该没有问题。

但是,您确实对result中的错误共享存在问题,但是如果不测试完整代码,我不知道它对您的性能有多大影响。

关于c++ - 避免同时访问变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16802600/

10-11 20:50