【问题标题】:GCC couldn't vectorize 64-bit multiplication. Can 64-bit x 64-bit -> 128-bit widening multiplication be vectorized on AVX2?GCC 无法向量化 64 位乘法。可以在 AVX2 上对 64 位 x 64 位 -> 128 位加宽乘法进行矢量化吗?
【发布时间】:2014-08-25 12:27:23
【问题描述】:

我尝试对使用 64 位扩展乘法的 CBRNG 进行矢量化。

static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t* hip) {
    __uint128_t product = ((__uint128_t)a)*((__uint128_t)b);
    *hip = product>>64;
    return (uint64_t)product;
}

这样的乘法在 AVX2 中是否以矢量化形式存在?

【问题讨论】:

    标签: c++ computer-science vectorization simd avx2


    【解决方案1】:

    没有。没有 64 x 64 -> 128 位算术作为向量指令。也没有向量mulhi类型指令(乘法的高字结果)。

    [V]PMULUDQ 可以做到 32 x 32 -> 64 位,方法是仅考虑每隔一个 32 位无符号元素或无符号双字作为源,并将每个 64 位结果扩展为两个组合为无符号四字的结果元素。

    您现在可能希望最好的是 Haswell 的 MULX 指令,它具有更灵活的寄存器使用,并且不影响标志寄存器 - 消除了一些停顿。

    【讨论】:

    • 是的,MULX 是正确的使用方式(如果您指定目标是 Haswell+,您的编译器应该为您生成它)
    • 我认为 mulx 在 Broadwell,而不是 Haswell
    • @LưuVĩnhPhúc,MULX 是 Haswell。您可以在 GCC 中使用__int128-march=haswell(或-mbmi2)进行检查。
    • 是的,我可能错了,因为我在许多页面上看到声称将在 Broadwell 中引入 MULX、ADOX 和 ADCX
    • 那么我可以使用其他一些乘法方法,比如 Karatsuba 算法吗?
    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2015-09-13
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多