有两个int矩阵A和B,超过1000行和10K列,我经常需要将它们转换为float矩阵以获得加速(4x或更多)。
我想知道为什么会这样?我意识到有许多优化和矢量化,如AVX等,继续浮点矩阵乘法。但是,对于整数(如果我没有弄错的话),有指令AVX2。并且,不能使用SSE和AVX作为整数吗?
为什么在矩阵代数库(例如Numpy或Eigen)下面没有启发式来捕获它并像浮点一样更快地执行整数矩阵乘法?
关于已接受答案:虽然@ sascha的回答非常有用且相关,@ chatz的回答是int乘以int的实际原因,无论是否为存在BLAS整数矩阵运算。
答案 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 too。 This 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;表示相互吞吐量,即每次操作使用多少个时钟周期,如果没有发生延迟(稍微简化)。