是否保证 OpenMP 矢量化
Is OpenMP vectorization guaranteed?
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( 实现定义:必须由实现记录的行为,并允许在不同的合规实现之间变化。允许实现将此行为定义为未指定。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- c=c+a*b的OpenMP 4 simd矢量化