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
等)。
答案 0 :(得分:4)
不,不保证。我能找到的OpenMP 4.5 standard的相关部分(强调我的):
(1.3)当任何线程遇到simd构造时,与构造关联的循环的迭代可能使用线程可用的SIMD通道同时执行。
(2.8.1)可以将simd构造应用于循环以指示循环可以转换为SIMD循环(即,循环的多次迭代可以使用并发执行SIMD说明)。
(附录C)在任何给定时间同时执行的迭代次数是实现定义的。
(1.2.7)实现定义:必须由实现记录的行为,并允许在不同的合规实现之间变化。允许实现将此行为定义为未指定。