避免对变量进行并发访问

时间:2013-05-28 22:34:16

标签: c++ parallel-processing openmp eigen

这是我的代码:

的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的给定元素?一些想法:

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

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

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

1 个答案:

答案 0 :(得分:1)

有什么问题?使用OpenMP的性能是否比没有更糟糕? OpenMP有一个开销,所以如果somefunction速度很快,而你只运行超过100个元素,那么OpenMP可能会带来更差的性能。

我没有看到每个线程访问M的问题。只要somefucntion没有写入M或N(只读取它们)就没有问题。

但是,您在result中遇到了错误共享的问题,但我不知道在没有测试完整代码的情况下,它对您的性能有多大影响。