2012-07-31 40 views
4

我正在試驗英特爾MKL庫使用它們提供的Boost :: uBLAS接口(包括mkl_boost_ublas_matrix_prod.hpp)執行矩陣乘法。我的數據只是整數,所以我嘗試將矩陣模板類型更改爲int,並且性能下降了,主要原因似乎是由於代碼只使用一個CPU內核而不是我已有的12個內核。我找不到MKL文檔中的任何內容來解釋爲什麼整數不使用MKL的OpenMP多線程功能(我猜他們根本不使用MKL?)。英特爾MKL矩陣產品性能與雙數據,浮點數和整型數據類型

此外,與浮動相比,我看到50%的雙打表現受到雙打打擊。

問題:

  1. 爲什麼和雙精度浮點數之間的差距呢?
  2. 爲什麼我不能使用整數?

下面是從下面的代碼我的結果:

matrix<float>(10000x10000): 13 seconds (12 threads used) 
matrix<double>(10000x10000): 26 seconds (12 threads used) 
    matrix<int>(10000x10000): >1000 seconds (1 thread used, stopped early) 
    matrix<float>(25000x25000): 187 seconds (12 threads used) 
matrix<double>(25000x25000): 401 seconds (12 threads used) 

代碼中使用(根據需要更換兩個矩陣<類型>行):

g++ Flags: -std=c++0x -O3 -DNDEBUG -DMKL_ILP64 -m64 -msse4.2 -march=native -mtune=native 
ld Flags: -lmkl_intel_ilp64 -lmkl_gnu_thread -lmkl_core -fopenmp -lpthread -lm 

#include <boost/numeric/ublas/matrix.hpp> 
#include <mkl_boost_ublas_matrix_prod.hpp> 

using namespace boost::numeric::ublas; 

void benchmark() { 

    int size = 10000; 
    matrix<float> m(size, size); 
    for (int i = 0; i < size; ++i) { 
     for (int j = 0; j < size; ++j) { 
      m(i,j) = 2*i-j; 
     } 
    } 
    matrix<float> r(size, size); 
    r = prod(m,m); 
} 

int main(int argc, char *argv[]) { 
    benchmark(); 
    return 0; 
} 

編譯時

處理器:

Intel Xeon E7530 with 6 Cores (x2) with HT. 

,因爲他們說,這不會有任何幫助,所以我有12個線程可用的MKL不使用超線程,而不是24

回答

6

爲什麼和雙精度浮點數之間的差距呢?

現代CPU使用向量指令來執行浮點運算。這些指令具有固定的吞吐量和長度,例如,每個英特爾至強E7530核心能夠在每個週期處理兩個128位的加法或乘法。這導致每個週期4個雙打或8個浮動。

爲什麼我不能使用整數?

ublas示例中的模板將浮點和雙模板的矩陣乘法映射到MKL SGEMM和DGEMM函數。將矩陣模板從float/double更改爲int時,BOOST使用矩陣乘法的參考實現,因爲MKL不支持整數矩陣乘法。

+0

太棒了,謝謝! – 2012-08-01 13:56:45