C 阵列中的OpenMP SIMD缩减:“0”;错误:必须在输入此OpenMP pragma时共享缩减变量;
我试图计算矩阵中相邻元素的平均值,但我一直无法让OpenMP的矢量化工作。根据我对第二个嵌套for循环的理解,C 阵列中的OpenMP SIMD缩减:“0”;错误:必须在输入此OpenMP pragma时共享缩减变量;,c,multithreading,parallel-processing,openmp,simd,C,Multithreading,Parallel Processing,Openmp,Simd,我试图计算矩阵中相邻元素的平均值,但我一直无法让OpenMP的矢量化工作。根据我对第二个嵌套for循环的理解,reduce子句应该确保在写入next的元素时不会出现争用条件。然而,在编译代码时(我尝试了GCC 7.3.0和ICC以及OpenMP>4.5的自动矢量化),我得到了报告:“错误:在输入此OpenMP pragma时必须共享减少变量“next”。为什么在默认情况下共享变量时会出现这种情况?添加shared(next)似乎没有帮助,如何解决此问题 //上面的代码(…) 尺寸常数宽度=100
reduce
子句应该确保在写入next
的元素时不会出现争用条件。然而,在编译代码时(我尝试了GCC 7.3.0和ICC以及OpenMP>4.5的自动矢量化),我得到了报告:“错误:在输入此OpenMP pragma时必须共享减少变量“next”。为什么在默认情况下共享变量时会出现这种情况?添加shared(next)
似乎没有帮助,如何解决此问题
//上面的代码(…)
尺寸常数宽度=100;
尺寸常数高度=100;
float*restrict next=malloc(sizeof(float)*宽度*高度);
//“下一步”的初始化(工作正常)
#用于simd崩溃的pragma omp(2)
对于(尺寸j=1;j
问题在于GCC 7.3.0不支持
#pragma omp for simd collapse(4) reduction(+:next[0:width*height])
在此上下文中使用数组节的缩减
转发支持此功能:
从GCC 9开始,就有了最初的OpenMP 5支持(基本上是C/C++,
仅限)。GCC10增加了更多的特性,主要是针对C/C++的,但也针对
Fortran