带有循环迭代器和omp simd

时间:2015-10-25 10:33:04

标签: c gcc openmp

当我尝试这个时

#pragma omp simd private(i)
for(i=0; i<n; i++)

使用GCC 5.2.1我收到错误

error: iteration variable ‘i’ should not be private

我也为firstprivatelastprivate收到同样的错误。我从这段代码中发现了这个

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时没有警告。

为什么我不能使用privateomp 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

1 个答案:

答案 0 :(得分:3)

不,具有单个关联for循环的simd构造中的循环迭代变量具有预定的数据共享类linear而不是privateOpenMP 4.0,§2.14。 1.1)。 linear提供的功能是private的超集,因此声明i(last)private是降级,因此是错误。