簡體   English   中英

OpenMP:'共享'的預定'共享'?

[英]OpenMP: predetermined 'shared' for '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導致相同的錯誤。)

我遇到了一個非常類似的問題,並且在我從OpenMP指令的shared部分中刪除共享const變量之后,可以使用Apple的GCC 4.2編譯這樣的程序。 它們被預先確定為共享,因為它們是常量,並且不需要為每個線程制作副本。 當編譯器已經知道時,編譯器似乎不接受明確地告訴它...

我也會刪除default(none)規范(但請參閱下面注釋 )。 OpenMP旨在減少明確的規范,所以讓它完成它的工作。

這是由於gcc-4.2中的OpenMP支持不足造成的。 代碼片段使用gcc-4.7編譯時沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM