是否保证 OpenMP 矢量化

Is OpenMP vectorization guaranteed?

本文关键字:矢量化 OpenMP 是否      更新时间:2023-10-16

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 等(。

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

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

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

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

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