shizukupr
V2EX  ›  问与答

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

  •  
  •   shizukupr · Aug 13, 2023 · 1295 views
    This topic created in 1024 days ago, the information mentioned may be changed or developed.

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

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

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

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

    3 replies    2023-08-14 16:39:34 +08:00
    AirCrusher
        1
    AirCrusher  
       Aug 13, 2023
    @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
       Aug 14, 2023
    @AirCrusher 有一点很离谱的是在原来的程序里面确实是直接 cast 到`double*`就开始进行读写,这样用编译器会自动生成 load/store 指令吗
    AirCrusher
        3
    AirCrusher  
       Aug 14, 2023
    @shizukupr 用 icx 试了一下,确实这么做是可以的,我上面说错了。往 AVX 寄存器的地址写入的时候,编译器会生成 scalar 的 vector move 指令 (vmovsd),而不是 packed (vmovupd) 。
    可以在 godbolt.org 上尝试。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3224 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 13:40 · PVG 21:40 · LAX 06:40 · JFK 09:40
    ♥ Do have faith in what you're doing.