为什么通过浮点矩阵乘法执行浮点比使用int int更快?

NUL*_*ULL 25 c++ numpy matrix eigen

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

我想知道为什么会这样?我意识到有许多优化和矢量化,如AVX等,继续浮点矩阵乘法.但是,对于整数(如果我没有记错的话),有指令如AVX2.并且,不能使用SSE和AVX作为整数?

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

关于已接受的答案:虽然@ sascha的答案非常有用且相关,@ chatz的答案是int乘以int的实际原因,无论是否存在BLAS整数矩阵运算.

sas*_*cha 14

所有这些矢量矢量和矩阵矢量操作都在内部使用BLAS.BLAS针对不同的archs,cpus,指令和缓存大小进行了数十年的优化,没有整数类型!

以下是OpenBLAS的一些分支(以及链接它的google-groups的一些小讨论).

我想我听说英特尔的MKL(英特尔的BLAS实现)也可能正在研究整数类型.这个演讲看起来很有趣(在该论坛中提到),尽管它很短,可能更接近嵌入式深度学习中有用的小积分类型).

  • 看起来像[Blaze](https://bitbucket.org/blaze-lib/blaze)支持整数 (3认同)
  • @NULL我也没有使用它,但是我已经看了一下它的谈话,他们确实提供了一些不错的性能数字. (2认同)
  • Eigen 不依赖于单独的 BLAS 实现。默认情况下,它使用自己的实现(但是,您可以告诉它使用外部 BLAS)。 (2认同)

cht*_*htz 13

如果你编译这两个基本上只是计算产品的简单函数(使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

参考:英特尔内部指南,"吞吐量"表示相互吞吐量,即每个操作使用多少个时钟周期,如果没有发生延迟(稍微简化).

  • 出乎意料但并不令人惊讶.浮点矩阵运算在计算机图形中被大量使用,引起了人们对硬件优化它们的极大兴趣.应用范围从显而易见的(视频游戏和网络应用程序)到面向研究的模拟引擎和数学建模.此外,如果您认为这些是快速的,您可以在视频卡上获得更多的浮点运算吞吐量编程这些类型的操作(一个很好的例子是nVidia的CUDA平台).视频卡专为大规模并行浮点运算而构建. (2认同)