0

这是我的代码:

主文件

#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

标头.h:

#include <Eigen/Dense>
using namespace Eigen;

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

int somefunction(const VectorR&, const VectorR&)

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

  1. 我可以/应该直接在读取 M 的文件中直接放置#pragma omp criticalatomic指令吗?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â

4

1 回答 1

1

问题是什么?使用 OpenMP 的性能是否比不使用时更差?OpenMP 有使用开销,所以如果somefunction速度很快并且您只运行超过 100 个元素,那么 OpenMP 可能会提供更差的性能。

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

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

于 2013-05-29T07:46:19.360 回答