GCC 无法矢量化 64 位乘法。64 位 x 64 位 -> 128 位加宽乘法可以在 AVX2 上矢量化吗?

Yig*_*rag 5 c++ computer-science simd vectorization avx2

我尝试对使用 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Bre*_*ale 4

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

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

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