9

この関数を参照してください(行列-ベクトル積):

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でも同じエラーが発生することに注意してください。)

4

2 に答える 2

5

私は非常によく似た問題を抱えており、OpenMPディレクティブconstのセクションから共有変数を削除した後、AppleのGCC4.2を使用してそのようなプログラムをコンパイルできることを経験しました。sharedそれらは一定であり、スレッドごとにコピーを作成する必要がないため、共有として事前に決定されています。そして、コンパイラは、すでに知っているときに明示的にそれを伝えることを受け入れていないようです…</ p>

仕様も削除しdefault(none)ます(ただし、以下のコメントを参照してください)。OpenMPは明示的な仕様を減らすことを目的としているので、その仕事をさせてください。

于 2012-12-07T20:54:51.087 に答える
0

これは、gcc-4.2でのOpenMPサポートが不十分なために発生します。コードフラグメントは、gcc-4.7を使用して問題なくコンパイルされます。

于 2012-11-02T21:08:28.227 に答える