2017-07-28 96 views
23

有兩個整數矩陣A和B,有1000多行和10K列,我經常需要將它們轉換爲浮點矩陣以獲得加速(4倍或更多)。爲什麼通過浮點矩陣乘法執行浮點運算比通過int運算的int運算更快?

我想知道爲什麼會出現這種情況?我意識到有很多優化和矢量化,比如AVX等等,都是用浮點矩陣乘法進行的。但是,對於整數(如果我沒有弄錯的話),有這樣的AVX2指令。而且,不能將SSE和AVX用於整數嗎?

爲什麼沒有像Numpy或Eigen這樣的矩陣代數庫下面的啓發式捕獲這個問題,並像float一樣更快地執行整數矩陣乘法?

關於接受的答案:雖然@薩沙的回答是非常翔實和相關性,@翠弧的答案是實際的原因,通過INT乘法int是緩慢的,不論是否存在BLAS整數矩陣運算。

+5

這將有助於提出更具體的問題,但由於更多人需要將其用於float,因此需要花費更多精力來優化float(軟件和硬件)。 –

+0

此問題需要特定示例代碼來演示性能差異(請參閱[mcve])。特別是考慮到代碼被標記爲[C++]和[numpy],你完全不清楚你指的是什麼。 – Zulan

回答

9

如果您編譯使用標誌-mavx2 -S -O3你會看到非常相似的彙編代碼,對於整數和浮點版本這兩個簡單的功能,這本質上只是計算產品(使用本徵庫)

#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); 
} 

。 但主要區別在於vpmulld的延遲是2-3倍,僅爲vmulps的吞吐量的1/2或1/4。 (在最近的Intel體系結構上)

參考:Intel Intrinsics Guide,「吞吐量」表示互易吞吐量,即如果沒有延遲發生(稍微簡化),則每個操作使用多少個時鐘週期。

+0

非常有趣!從來沒有想過'vpmulld'和'vmulps'在吞吐量和延遲方面可能會有所不同。 – NULL

+0

意外但並不令人驚訝。浮點矩陣操作在計算機圖形學中被大量使用,引起了對硬件優化的大量興趣。應用範圍從明顯的(視頻遊戲和網絡應用)到研究型仿真引擎和數學建模。另外,如果你認爲速度很快,那麼你可以在視頻卡上獲得更多的浮點操作吞吐量(這是一個很好的例子,就是nVidia的CUDA平臺)。視頻卡專門用於大規模並行浮點運算。 – user1258361

13

所有那些矢量矢量和矩陣矢量操作都在內部使用BLAS。對於不同的arch,cpus,指令和緩存大小,BLAS經過幾十年的優化,沒有整數類型!

Here is some branch of OpenBLAS正在工作(和一些tiny discussion at google-groups linking it)。

我想我聽說英特爾的MKL(英特爾BLAS實現)might be working on integer-types tooThis talk看起來很有趣(在論壇中提到過),雖然它很短,可能更接近小整數類型在嵌入式深度學習中很有用)。

+1

看起來像[Blaze](https://bitbucket.org/blaze-lib/blaze)支持整數 – NathanOliver

+1

Eigen使用整數,當你用'g ++ -O3 -march = somethingrecent'編譯時,它是矢量化的,你會看到像'vpmulld'這樣的說明。 –

+0

可以支持和向量化整型操作符(我期望它可以在高質量的庫中),但問題是:它可以與手動調整的BLAS代碼競爭嗎? – sascha