2012-11-02 7 views
7

は、この関数(行列 - ベクトル積)を参照してください:OpenMP: 'shared'にあらかじめ 'shared'が設定されていますか?

std::vector<double> times(std::vector<std::vector<double> > const& A, std::vector<double> const& b, int m, int n) { 

    std::vector<double> c; 
    c.resize(n); 

    int i, j; 
    double sum; 

    #pragma omp parallel for default(none) private(i, j, sum) shared(m, n, A, b, c) 
    for (i = 0; i < m; ++i) { 
     sum = 0.0; 
     for (j = 0; j < n; j++) { 
      sum += A[i][j] * b[j]; 
     } 
     c[i] = sum; 
    } 

    return c; 
} 

のOpenMPでこれをコンパイルしようと、コンパイラはで失敗した場合:

Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fopenmp -MMD -MP -MF"src/OpemMPTutorial.d" -MT"src/OpemMPTutorial.d" -o "src/OpemMPTutorial.o" "../src/OpemMPTutorial.cpp" 
../src/OpemMPTutorial.cpp:127: warning: ignoring #pragma omp end 
../src/OpemMPTutorial.cpp: In function 'std::vector<double, std::allocator<double> > times(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<double, std::allocator<double> >&, int, int)': 
../src/OpemMPTutorial.cpp:200: error: 'b' is predetermined 'shared' for 'shared' 
../src/OpemMPTutorial.cpp:200: error: 'A' is predetermined 'shared' for 'shared' 
make: *** [src/OpemMPTutorial.o] Error 1 

ここで何が悪いのでしょうか?

(単に同じエラーconst結果を除去することに留意されたい。)

+1

私は 'g ++ 4.6.3'を使って問題なくコンパイルしました。 – Massimiliano

+0

私は 'i686-apple-darwin11-llvm-gcc-4.2'を使用しています。このコンパイラのバージョンに問題がある可能性があります。私はgcc 4.7にアップグレードしようとしています – clstaudt

+0

@cls:私は冗談を言っていました。私はOpenMPを使用していないので、以前はこのGCCエラーは見たことがありません。だからあなたは私に新鮮なGCCエラーを与えただけでupvoteを手に入れました。 –

答えて

0

これは、GCC-4.2が不十分OpenMPサポートによって引き起こされます。コード断片は、gcc-4.7を使っても問題なくコンパイルできます。

+4

gcc-4.7.2がメッセージを再度表示します。解決策は次のとおりです。データ共有句のいずれにも定数を記述する必要はありません。これは 'default(none)'でも使えます。 –

4

私はOpenMP指令のsharedセクションから共有されたconst変数を削除した後、AppleのGCC 4.2を使ってこのようなプログラムをコンパイルすることができます。それらは定数であり、スレッドごとにコピーを作成する必要がないため、共有として事前に決定されます。そして、コンパイラは既にそれが明白にそれを知っているときにそれを明示的に伝えることを受け入れていないようです...

私はdefault(none)仕様を削除します(ただし、comment below参照)。 OpenMPは明示的な仕様を減らすことを目的としているため、その動作をさせてください。

+2

'default(none)'を削除することは悪い考えです。 'default'キーワードがなければ、共有戦略は暗黙的に決定されます。これはほとんどの場合' shared'になります([openmp 4.0仕様]の2.14.1.1章(http://www.openmp.org/mp-documents/OpenMP4)。 0.0.pdf))。共有メンバーへのアクセスを同期させる必要があります。 'default(none)'がなければ、気づかずにデータレースを導入するのは簡単です。 'default(none)'は、あなたがメンバーをどのように使用するかを考えるよう強制します。 –

関連する問題