具有double,float和int数据类型的英特尔MKL矩阵产品性能

时间:2012-07-31 14:44:43

标签: c++ intel-mkl

我正在尝试使用英特尔MKL库,使用他们提供的Boost :: uBLAS接口执行矩阵乘法(包括mkl_boost_ublas_matrix_prod.hpp)。我的数据只是整数,所以我尝试将我的矩阵模板类型更改为int并且性能下降,主要是因为代码只使用了一个CPU内核而不是我可用的12个。我在MKL文档中找不到任何解释为什么整数没有使用MKL的OpenMP多线程功能(我猜他们根本没有使用MKL?)。

此外,与浮动相比,我看到双打性能提升了50%。

问题:

  1. 为什么浮动和双打之间存在差异?
  2. 为什么我不能使用整数?
  3. 以下代码的结果如下:

      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)
    

    使用的代码(根据需要替换矩阵&lt; type&gt;行):

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

    编译:

     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
    

    处理器:

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

    MKL不使用超线程,因为他们说这对任何事都没有帮助,所以我有12个线程可用,而不是24个。

1 个答案:

答案 0 :(得分:6)

  

为什么浮动和双打之间存在差异?

现代CPU使用向量指令来执行浮点算术。这些指令具有固定的吞吐量和长度,例如,英特尔至强E7530的每个核心都能够处理每个周期两个128位的加法或乘法。这导致每个循环4个双打或8个浮点数。

  

为什么我不能使用整数?

ublas示例中的模板将float和double模板的矩阵乘法映射到MKL SGEMM和DGEMM函数。当您将矩阵模板从float / double更改为int时BOOST使用矩阵乘法的参考实现,因为MKL不支持整数矩阵乘法。