首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP:为“shared”预先定义的“shared”?

OpenMP:为“shared”预先定义的“shared”?
EN

Stack Overflow用户
提问于 2012-11-03 00:33:16
回答 2查看 5K关注 0票数 9

查看此函数(矩阵-向量积):

代码语言:javascript
复制
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编译此代码时,编译器会失败,并显示以下信息:

代码语言:javascript
复制
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会导致相同的错误。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-03 05:08:28

这是由于gcc-4.2中对OpenMP的支持不足造成的。使用gcc-4.7可以毫无问题地编译代码片段。

票数 0
EN

Stack Overflow用户

发布于 2012-12-08 04:54:51

我有一个非常类似的问题,在我从OpenMP指令的shared部分删除了共享的const变量后,我体验到这样的程序可以用苹果的GCC 4.2编译。它们被预先确定为共享的,因为它们是常量,并且不需要为每个线程制作副本。而且编译器似乎不接受在知道已经…的情况下显式地告诉它

我还会删除default(none)规范(但请参阅comment below)。OpenMP旨在减少显式规范,所以让它来做它的工作吧。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13199398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档