V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shizukupr
V2EX  ›  问与答

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

  •  
  •   shizukupr · 2023-08-13 22:16:02 +08:00 · 874 次点击
    这是一个创建于 470 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    3 条回复    2023-08-14 16:39:34 +08:00
    AirCrusher
        1
    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
        2
    shizukupr  
    OP
       2023-08-14 12:54:14 +08:00
    @AirCrusher 有一点很离谱的是在原来的程序里面确实是直接 cast 到`double*`就开始进行读写,这样用编译器会自动生成 load/store 指令吗
    AirCrusher
        3
    AirCrusher  
       2023-08-14 16:39:34 +08:00
    @shizukupr 用 icx 试了一下,确实这么做是可以的,我上面说错了。往 AVX 寄存器的地址写入的时候,编译器会生成 scalar 的 vector move 指令 (vmovsd),而不是 packed (vmovupd) 。
    可以在 godbolt.org 上尝试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:48 · PVG 22:48 · LAX 06:48 · JFK 09:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.