有两个 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/