OpenMP - 为什么firstprivate导致错误?

时间:2011-01-17 12:12:58

标签: c openmp

为什么我会收到此错误,我该怎么办?

error: firstprivate variable 'j' is private in outer context

void foo() {
    int i;
    int j = 10;
    #pragma omp for firstprivate(j)
    for (i = 0; i < 10; i++)
        printf("%d\n", j);
}

2 个答案:

答案 0 :(得分:7)

如果您使用编译指示

,则有效
#pragma omp parallel for firstprivate(j)

请注意,omp foromp parallel for不是一回事:后者是omp foromp parallel的简写。

答案 1 :(得分:1)

我删除了我的第一个答案,因为我遗漏了一些错误。错误是正确的,因为OpenMP V3.0规范(和以前的版本)的限制,第2.9.3.4节firstprivate子句,限制项目2:

  

•并行区域内的私有列表项不得出现在   如果任何工作共享,工作共享构造的firstprivate子句   工作共享构造产生的区域与任何平行区域都有约束力   并行构造产生的区域。

问题在于,它不知道要在执行工作共享区域的线程中使用哪个私有值。如果它是一个新的并行区域,则每个线程将创建一个新区域,并且从创建该区域的线程的私有副本复制firstprivate。