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/

相关文章:

matlab - 复制向量并将每个副本向下移动 1 行,无需 for 循环

c++ - 获取错误表达式必须具有 C++ 中的类类型

c++ - 无法测量 Windows 下由 std::vector<>::reserve 引起的内存分配

c++ - 每次我添加新的源子文件夹时,Cmake 都会重新编译所有内容

python - 通过删除 numpy 数组来释放内存

algorithm - 查找邻接矩阵图的连通分量

java - 我怎样才能得到一个方阵并将其放入另一个矩阵?

java - Vim 编辑器很聪明吗?

python - Caffe 特征提取太慢? caffe.Classifier 或 caffe.Net

numpy - 是否可以使用 numba 加速基于 xarray 的代码?