OpenMP矢量化是否有保证?

时间:2018-01-11 18:23:14

标签: c++ openmp vectorization simd

OpenMP标准是否保证#pragma omp simd能够正常工作,即如果编译器无法对代码进行矢量化,编译是否会失败?

#include <cstdint>
void foo(uint32_t r[8], uint16_t* ptr)
{
    const uint32_t C = 1000;
    #pragma omp simd
    for (int j = 0; j < 8; ++j)
        if (r[j] < C)
            r[j] = *(ptr++);
}

gcc和clang无法对此进行矢量化,但根本不会抱怨(除非您使用-fopt-info-vec-optimized-missed等)。

1 个答案:

答案 0 :(得分:4)

不,不保证。我能找到的OpenMP 4.5 standard的相关部分(强调我的):

  

(1.3)当任何线程遇到simd构造时,与构造关联的循环的迭代可能使用线程可用的SIMD通道同时执行。

     

(2.8.1)可以将simd构造应用于循环以指示循环可以转换为SIMD循环(即,循环的多次迭代可以使用并发执行SIMD说明)。

     

(附录C)在任何给定时间同时执行的迭代次数是实现定义的。

     

(1.2.7)实现定义:必须由实现记录的行为,并允许在不同的合规实现之间变化。允许实现将此行为定义为未指定。