我正在用C(一个二维泊松解算器)编写一个程序,我正在使用openMP来加速一个大的for循环。我观察到的是,在openMP并行块中,for循环不会被矢量化,即使在我包含#pragma总是vector指令的情况下也是如此。对于编译,我使用的是pathscale编译器。
我想要矢量化的代码如下所示:
#pragma omp parallel shared(in, out, lambda,dim,C) private(k)
{
#pragma omp for schedule(guided,dim/nthreads) nowait
for(k = 0;k < dim; k++){
in[k] = C*out[k]*lambda[k];
}
}
其中out、lambda和in是双精度数组。
但是,即使我包含#pragma总是向量,编译器的答案也是:
warning: ignoring #pragma always vector
你知道是否有解决办法吗?
谢谢。
我查阅了PathScale编译器的《用户指南》,但既没有找到#pragma always
,也没有发现#pragma vector
。所以我认为编译器只是告诉你它不识别这个杂注,并忽略它
然而,在第7.4.5节中,我发现了以下选项可以帮助您进行矢量化:
用户代码的矢量化。。。由启用或禁用内部循环矢量化的标志
-LNO:simd[=(0|1|2)]
控制。0关闭矢量化器,1(默认值)仅当编译器能够确定没有由于次优对齐而造成的不希望的性能影响时才使其进行矢量化,2将在没有任何约束的情况下进行矢量化(这是最激进的)。
-LNO:simd_verbose=ON
将矢量化器信息(来自矢量化用户代码)打印到stdout。
顺便说一句(猜测#pragma always vector
从哪里来),英特尔编译器有#pragma vector
,always
可能是杂注的一个参数。但是杂注通常是特定于编译器的,除了少数几个由多个供应商支持的扩展(OpenMP就是其中之一)。