咨询一个关于使用 AVX 编程的问题

2023-08-13 22:16:02 +08:00
 shizukupr

我遇到了下面这样使用 avx 的数据类型的方法

__m256d VPFX_vx0[1];
double *vx0 = VPFX_vx0;

这样的代码在 C 中编译通过产生一个 warning ,但是在 C++中却无法通过编译( C 使用 clang ,C++使用 clang++)。

现在正在迁移一个使用了上面这种方式调用 avx 的程序,很好奇这样是什么样的用法,已经可以确定的是这样的行为在原始程序中能够正常工作并且产生预期行为。

875 次点击
所在节点    问与答
3 条回复
AirCrusher
2023-08-13 22:58:42 +08:00
@shizukupr __m256d 相当于 double[4],这里 warning 我猜是从 m256d*转换到 double*产生的,C++的类型转换更严格,可以写成 double *vx0 = reinterpret_cast<double *>(VPFX_vx0)。
但是注意,AVX 有自己的 load/store 指令和对应的寄存器,例如_mm256_add_pd ,而不能简单 cast 成 double[]并往里面读写。
shizukupr
2023-08-14 12:54:14 +08:00
@AirCrusher 有一点很离谱的是在原来的程序里面确实是直接 cast 到`double*`就开始进行读写,这样用编译器会自动生成 load/store 指令吗
AirCrusher
2023-08-14 16:39:34 +08:00
@shizukupr 用 icx 试了一下,确实这么做是可以的,我上面说错了。往 AVX 寄存器的地址写入的时候,编译器会生成 scalar 的 vector move 指令 (vmovsd),而不是 packed (vmovupd) 。
可以在 godbolt.org 上尝试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/964957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX