SIMD(向量)函数的混乱现实

主要观点:探讨了 SIMD 函数,包括其定义、使用、参数类型、编译器支持限制、提供自定义向量实现等方面。
关键信息

  • SIMD 函数可处理多个数据,如double sin(double angle)的向量版本double[4] sin(double angle[4])__m256d sin(__m256d)
  • 有两种类型的向量函数,文中主要讨论编译器可自动向量化循环的类型。
  • 可通过自定义编译器 pragmas 或 OpenMP pragmas 声明和定义向量函数,且在声明和定义处有差异。
  • 函数参数有variable(默认,各车道值任意)、uniform(各车道值相同)、linear(各车道值线性)等类型。
  • inbranchnotinbranch属性用于控制函数在分支中的行为。
  • 编译器支持有限,如 clang20 不支持#pragma omp declare simd,GCC15.1 支持。
  • 编译器生成的向量函数实现可能低效,如 GCC 常将向量函数实现为标量函数重复多次。
  • 可使用 intrinsics 提供自定义向量实现,但无标准 OMP 方式,需深入了解编译器相关细节。
    重要细节
  • 示例代码如计算连续或任意 4 列的向量函数sum_column,以及sin函数的不同版本。
  • 向量函数名的编码规则,如_ZGV表示向量前缀,b/c/d/e表示目标 ISA 等。
  • 覆盖向量函数时需注意声明和定义的位置及相关参数,如#pragma omp declare simdextern "C"等。
  • 函数内联在处理向量函数时的注意事项及使用-flto标志。
  • GCC 向量函数功能存在的一些问题,如自动向量化效率低、特定条件下不生成向量调用等。
阅读 12
0 条评论