0

これが私のコードです:

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&)

M複数のスレッドがinの特定の要素にsomefunction同時にアクセスしないようにするにはどうすればよいですか? いくつかの考え:

  1. M が読み取られるファイルに#pragma omp criticaloratomicディレクティブを直接配置できますか/すべきですか?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 に答える