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

时间:2014-07-04 08:14:37

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

我尝试对使用64位加宽乘法的CBR​​NG进行矢量化。

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中的矢量化形式是否存在这样的乘法?

1 个答案:

答案 0 :(得分:3)

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

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

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