我正在用C语言编写一个程序(一个2d泊松求解器),我正在使用openMP来加速一个大的for循环。我观察到的是,在openMP并行块内部,即使在我包含 #pragma always vector 指令的情况下,for循环也没有矢量化。对于编译我使用的是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 always vector ,编译器回答的是:
warning: ignoring #pragma always vector
您知道是否有解决方法吗?
感谢。
答案 0 :(得分:3)
我浏览了the User Guide for the PathScale compiler,但未找到#pragma always
或#pragma vector
。所以我认为编译器只是告诉你它不能识别这个pragma,而忽略它。
然而,在7.4.5节中,我找到了以下可以帮助你进行矢量化的选项:
用户代码的矢量化......由标志
-LNO:simd[=(0|1|2)]
控制,该标志启用或禁用内循环矢量化。 0关闭向量化程序,1(默认值)导致编译器仅在它可以确定由于次优对齐而没有不良性能影响时进行向量化,并且2将在没有任何约束的情况下进行向量化(这是最具侵略性的)。
-LNO:simd_verbose=ON
将矢量化器信息(从矢量化用户代码)打印到stdout。
作为旁注(猜测你可以从#pragma always vector
开始),Intel's compiler has #pragma vector
always
是pragma的一个可能参数。但是pragma通常是特定于编译器的,除了少数供应商支持的少数扩展(OpenMP是一个)。