c++ - 与 int 乘 int 相比,为什么执行浮点乘浮点矩阵乘法更快?

标签 c++ numpy matrix eigen avx

有两个 int 矩阵 A 和 B,有超过 1000 行和 10K 列,我经常需要将它们转换为浮点矩阵以获得加速(4 倍或更多)。

我想知道为什么会这样?我意识到浮点矩阵乘法有很多优化和矢量化,例如 AVX 等。但是,对于整数(如果我没记错的话)有诸如 AVX2 之类的指令。而且,不能将 SSE 和 AVX 用于整数吗?

为什么在矩阵代数库(如 Numpy 或 Eigen)下没有启发式算法来捕获这一点并像 float 一样更快地执行整数矩阵乘法?

About accepted answer: While @sascha's answer is very informative and relevant, @chatz's answer is the actual reason why the int by int multiplication is slow irrespective of whether BLAS integer matrix operations exist.

最佳答案

如果你编译这两个简单的函数,本质上只是计算一个产品(使用 Eigen 库)

#include <Eigen/Core>

int mult_int(const Eigen::MatrixXi& A, Eigen::MatrixXi& B)
{
    Eigen::MatrixXi C= A*B;
    return C(0,0);
}

int mult_float(const Eigen::MatrixXf& A, Eigen::MatrixXf& B)
{
    Eigen::MatrixXf C= A*B;
    return C(0,0);
}

使用标志 -mavx2 -S -O3 您将看到非常相似的汇编代码,用于整数和浮点版本。 然而,主要区别在于 vpmulld 的延迟是 vmulps 的 2-3 倍,吞吐量仅为 vmulps 的 1/2 或 1/4。 (关于最新的英特尔架构)

引用:Intel Intrinsics Guide , “吞吐量”表示倒数的吞吐量,即每次操作使用多少个时钟周期,如果没有发生延迟(稍微简化)。

关于c++ - 与 int 乘 int 相比,为什么执行浮点乘浮点矩阵乘法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373679/

相关文章:

c++ - c++成员函数多态性问题

c++ - 自定义哈希表实现-将字符串映射到整数时出现内存错误

c++ - 'printf' 与 C++ 中的 'cout'

c++ - 无法让简单的 COM 项目工作 : where and how to put implementation?

python - 查找值为真的 boolean 数组的索引

c - 矩阵乘法

python - 在处理奇异矩阵方程式时,为什么Mathematica和Python的答案不同?

C:转置矩阵,段错误

python - 如何防止被零除或替换 Theano 中的无限值?

python - 取 numpy 数组中列的平均值