OpenMP矢量化是否有保证?

Tra*_*s3r 5 c++ simd vectorization openmp

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++);
}
Run Code Online (Sandbox Code Playgroud)

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

Zul*_*lan 5

不,我们不能保证。我可以找到的OpenMP 4.5 标准的相关部分(强调我的):

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

(2.8.1) simd 构造可以应用于循环,以指示该循环可以转换为 SIMD 循环(即,可以使用 SIMD 指令同时执行循环的多个迭代)。

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

(1.2.7) 实现定义:必须由实现记录的行为,并且允许在不同的兼容实现之间有所不同。允许实现将此行为定义为未指定。