为什么我会收到此错误,我该怎么办?
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);
}
答案 0 :(得分:7)
如果您使用编译指示
,则有效#pragma omp parallel for firstprivate(j)
请注意,omp for
和omp parallel for
不是一回事:后者是omp for
内omp parallel
的简写。
答案 1 :(得分:1)
我删除了我的第一个答案,因为我遗漏了一些错误。错误是正确的,因为OpenMP V3.0规范(和以前的版本)的限制,第2.9.3.4节firstprivate子句,限制项目2:
•并行区域内的私有列表项不得出现在 如果任何工作共享,工作共享构造的firstprivate子句 工作共享构造产生的区域与任何平行区域都有约束力 并行构造产生的区域。
问题在于,它不知道要在执行工作共享区域的线程中使用哪个私有值。如果它是一个新的并行区域,则每个线程将创建一个新区域,并且从创建该区域的线程的私有副本复制firstprivate。