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

时间:2017-07-28 12:33:18

标签: c++ numpy matrix eigen

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

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

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

  

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

2 个答案:

答案 0 :(得分:14)

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

Here is some branch of OpenBLAS正在处理它(以及一些tiny discussion at google-groups linking it)。

我认为我听过英特尔的MKL(英特尔的BLAS实施)might be working on integer-types tooThis talk看起来很有趣(在该论坛中提到),虽然它很短,可能更接近小积分类型在嵌入式深度学习中很有用。)

答案 1 :(得分:12)

如果你编译这两个基本上只是计算产品的简单函数(使用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具有2-3倍的延迟,仅为vmulps的吞吐量的1/2或1/4。 (在最近的英特尔架构上)

参考:Intel Intrinsics Guide,&#34;吞吐量&#34;表示相互吞吐量,即每次操作使用多少个时钟周期,如果没有发生延迟(稍微简化)。