首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >你怎么能让gcc把这个平方环完全矢量化?

你怎么能让gcc把这个平方环完全矢量化?
EN

Stack Overflow用户
提问于 2020-08-23 00:04:26
回答 2查看 658关注 0票数 5

如果我取了这个密码

代码语言:javascript
运行
复制
#include <cmath>

void compute_sqrt(const double* x, double* y, int n) {
  int i;
#pragma omp simd linear(i)
  for (i=0; i<n; ++i) {
    y[i] = std::sqrt(x[i]);
  }
}

然后用g++ -S -c -O3 -fopenmp-simd -march=cascadelake编译,然后在循环中得到这样的指令(编译器资源管理器)

代码语言:javascript
运行
复制
...
  vsqrtsd %xmm0, %xmm0, %xmm0
...

XMMs是128位寄存器,但是级联寄存器支持avx-512。有没有办法让gcc使用256 (YMM)或512位(ZMM)寄存器?

相比之下,ICC默认使用256个寄存器作为级联:使用icc -c -S -O3 -march=cascadelake -qopenmp-simd produces (编译器资源管理器)编译。

代码语言:javascript
运行
复制
...
  vsqrtpd 32(%rdi,%r9,8), %ymm1 #7.12
...

您还可以添加选项-qopt-zmm-usage=high来使用512位寄存器(编译器资源管理器)。

代码语言:javascript
运行
复制
...
  vrsqrt14pd %zmm4, %zmm1 #7.12
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-23 00:26:59

XMM是128位寄存器。

更糟糕的是,vsqrtsd甚至不是向量操作,正如sd在末尾所指出的那样(标量,双精度)。像这样的标量浮点操作也使用XMM寄存器,但是只有低64或32位的寄存器包含有用的数据,其余的则为零。

缺少的选项是-fno-math-errno ( -ffast-math也暗示了这个标志,它有附加的效果)和(可选) -mprefer-vector-width=512

-fno-math-errno关闭数学操作的errno设置,特别是对于平方根--这意味着NaN中的负值输入结果,而不将errno设置为EDOM。在默认情况下,国际刑事法院显然不关心这一点。

-mprefer-vector-width=512使自动矢量化在有意义时更喜欢512位操作。默认情况下,256位操作是首选的,至少对于cascadelakeskylake-avx512以及其他当前处理器来说,它可能不会在未来的所有处理器上保持这种状态。

票数 5
EN

Stack Overflow用户

发布于 2020-08-23 00:20:24

如果添加-ffast-math标志,gcc将使用YMM寄存器,例如:

代码语言:javascript
运行
复制
vsqrtpd (%rdi,%rax), %ymm0
vmovupd %ymm0, (%rcx,%rax)

演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63542208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档