OpenMP:为"共享"预先确定"共享"?

OpenMP: predetermined 'shared' for 'shared'?

本文关键字:共享 OpenMP      更新时间:2023-10-16

请参阅此功能(矩阵向量产品):

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会导致相同的错误。)

我有一个非常相似的问题,并且在我从OpenMP指令的shared部分中删除了共享的const变量后,可以使用Apple的GCC 4.2编译此类程序。由于它们是恒定的,因此无需为每个线程制作副本,因此它们被预定为共享。而且,编译器似乎只是不接受明确告诉它。

我还将删除default(none)规范(但请参见下面的评论)。OpenMP旨在减少明确的规格,因此让其完成工作。

这是由GCC-4.2中的OpenMP支持不足引起的。使用GCC-4.7。