当我尝试这个时
#pragma omp simd private(i)
for(i=0; i<n; i++)
使用GCC 5.2.1我收到错误
error: iteration variable ‘i’ should not be private
我也为firstprivate
和lastprivate
收到同样的错误。我从这段代码中发现了这个
int i;
#pragma omp parallel for simd reduction(+:sum) lastprivate(i)
for(i=0; i<(n/8)*8; i++) sum += a[i];
for(; i<n; i++) sum += a[i];
然而,这很好用
int i,j;
#pragma omp parallel for simd reduction(+:sum) lastprivate(j)
for(i=0; i<(n/8)*8; i++) {sum += a[i]; j=i;}
for(; j<n; j++) sum += a[j];
但这似乎是一个愚蠢的黑客。
GCC也给了我警告
warning: ‘i’ may be used uninitialized in this function
parallel for simd
但仅在使用parallel for
时没有警告。
为什么我不能使用private
或omp simd
将{(1}}显式声明为并行循环迭代器?是不是暗含omp for simd
?
来自Hristo Iliev的答案中推荐的OpenMP 4.0规范第14.1.2节。
只有一个关联的for循环的simd构造的关联for循环中的循环迭代变量可以在具有常量线性步长的线性子句中列出 这是相关的for循环的增量。
具有多个关联for循环的simd构造的关联for循环中的循环迭代变量可以在lastprivate子句中列出。
这有效
private
但似乎不需要int i;
#pragma omp parallel for simd reduction(+:sum) linear(i)
for(i=0; i<(n/8)*8; i++) sum += a[i];
for(; i<n; i++) sum += a[i];
,因此迭代器默认为linear(i)
。
所以我可以做完
linear(i)
默认情况下, #pragma omp parallel for simd reduction(+:sum)
和lastprivate
显示迭代器实际上是omp simd
。
我仍然收到警告
omp for simd
我应该选择第14.1.1节
某些变量和对象具有预定的数据共享属性,如下所示:
simd 构造的关联for循环中的循环迭代变量只有一个关联的for循环是线性的,具有常量线性步长,即相关的for循环的增量
以下是一个工作示例,其中包含‘i’ may be used uninitialized in this function
的警告,但没有-fopenmp
-fopenmp
代码
‘i’ may be used uninitialized in this function
答案 0 :(得分:3)
不,具有单个关联for循环的simd
构造中的循环迭代变量具有预定的数据共享类linear
而不是private
(OpenMP 4.0,§2.14。 1.1)。 linear
提供的功能是private
的超集,因此声明i
为(last)private
是降级,因此是错误。