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

标签 c++ computer-science vectorization simd 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;
}

这样的乘法在 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/

相关文章:

c++ - 在 Windows 7 上捕获单个应用程序的音频

algorithm - 最被低估或鲜为人知但有用的算法是什么?

r - 向量化 R 代码,已使用序列符号

c++ - 将字符串宏/常量转换为宽字符/Unicode

c++ - 项目文件的树

algorithm - 证明 Dijkstra 算法中提取的距离值是非递减的?

c - 如何在 C 中旋转一维数组的一部分?

python - Numpy 相当于 if/elif/else,如果不满足条件则保留最后一个值

matlab - 将矩阵的每一列乘以另一个矩阵

c++ - sqlite c++ 体系结构 x86_64 的 undefined symbol