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实现)也可能正在研究整数类型.这个演讲看起来很有趣(在该论坛中提到),尽管它很短,可能更接近嵌入式深度学习中有用的小积分类型).
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
.(在最近的英特尔架构上)
参考:英特尔内部指南,"吞吐量"表示相互吞吐量,即每个操作使用多少个时钟周期,如果没有发生延迟(稍微简化).
归档时间: |
|
查看次数: |
1814 次 |
最近记录: |