我尝试对使用 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 中是否以 vector 形式存在?
最佳答案
没有。没有 64 x 64 -> 128 位算术作为 vector 指令。也没有 vector mulhi
类型的指令(乘法的高位字结果)。
[V]PMULUDQ 可以做 32 x 32 -> 64 位,只需考虑每隔一个 32 位无符号元素或无符号双字作为源,并将每个 64 位结果扩展为两个结果元素组合为一个无符号四字。
您现在可能希望得到的最好结果是 Haswell 的 MULX 指令,它具有更灵活的寄存器使用,并且不会影响标志寄存器 - 消除了一些停顿。
关于c++ - GCC 无法矢量化 64 位乘法。可以在 AVX2 上矢量化 64 位 x 64 位 -> 128 位加宽乘法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24569654/