" simd"之间的区别构建和"对于simd"在OpenMP 4.0中构造

时间:2015-07-24 18:13:35

标签: openmp simd

OpenMP 4.0引入了SIMD结构,以利用cpu的SIMD指令。根据规范http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf,有两种构造使用simd来矢量化循环。一个是" #pragma omp simd" ,另一个是" #pragma omp for simd" 。根据规范,两者都用于向量化循环。我也测试过并没有找到它们的区别。任何人都知道这两种结构之间是否存在差异?

1 个答案:

答案 0 :(得分:9)

#pragma omp simd(SIMD构造)指示OpenMP编译器在没有工作共享的情况下向后传递循环,即不在多个线程(如果有)之间分配循环迭代。

#pragma omp for(循环结构)指示编译器在当前团队的线程之间分配工作时执行以下循环。因此,循环结构仅在放置在并行区域的词法或动态范围内时才有用,例如

#pragma omp parallel
{
   ...
   #pragma omp for
   for (i = 0; i < 100; i++) { ... }
   ...
}

#pragma omp for simd(也称为循环SIMD构造)组合了上面的两个构造,即它既在团队中的线程之间分配迭代空间,又进一步向量化每个线程执行的部分循环。如果未在并行区域范围内使用,for simd构造等同于simd构造。

可以将循环SIMD构造与parallel构造结合起来:

#pragma omp parallel for simd
for (i = 0; i < 100; i++) { ... }

这个组合构造创建一个并行区域,在线程之间分配循环的迭代,并向量化部分循环。

请注意,有时矢量化和多线程在性能方面并不正交。例如,如果循环受内存限制,那么单独的矢量化和多线程都可能导致可用内存带宽耗尽,并且将它们组合起来不会带来任何进一步的加速。

此外,在将加速比与#pragma omp simd#pragma omp [parallel] for simd进行比较时,请记住,单独的多线程通常可以提供比矢量化更好的加速度,以获得相同数量的&#34;多样性&#34;,即一个四向SIMD-ised循环可能(并且很可能会)执行得比使用标量指令计算相同循环但在四个线程中分割的速度慢。