使用MKL的并行SpMV随着线程数的增加而减慢

时间:2017-12-28 06:48:24

标签: c++ multithreading intel-mkl

我正在为csr格式的SpMV调用intel MKL。为了加速,我使用 mkl_set_num_threads 的多个线程。但是,当线程增加时,性能会降低。知道发生了什么事吗?

虽然文档说 mkl_set_num_threads 指定的线程号仅限制使用的最大线程数,并且可能使用的线程较少,但我预计在使用更多线程时性能至少保持不变。   这是我的代码:

for(int j = 1; j <= max_threads; ++j){

    mkl_set_num_threads(j);

    mkl_scsrmv(&transa, &m, &k, &alpha, matdescra, val, col_idx, row_idx, &row_idx[1], x, &beta, y); 
    start = clock();

    for(int i = 0; i < 100; ++i) { 
            mkl_scsrmv(&transa, &m, &k, &alpha, matdescra, val, col_idx, row_idx, &row_idx[1], x, &beta, y);
    }
    end = clock();
    elapsed = end - start;
    cout << "the float CSR spmv performance is " << (double)nnz  * ( (double)CLOCKS_PER_SEC / 10000000 ) / (double)elapsed  << " Gflops using " << j << " threads" << endl;
}

结果如下:

  • 浮动CSR spmv性能为0.634938 Gflops,使用1个线程
  • 浮动CSR spmv性能为0.535313 Gflops,使用2个线程
  • 浮动CSR spmv性能为0.494569 Gflops,使用3个线程
  • 浮动CSR spmv性能为0.483146 Gflops,使用4个线程
  • 浮动CSR spmv性能为0.421995 Gflops,使用5个线程
  • 浮动CSR spmv性能为0.417408 Gflops,使用6个线程
  • 浮动CSR spmv性能为0.386758 Gflops,使用7个线程
  • 浮动CSR spmv性能为0.393107 Gflops,使用8个线程
  • 浮动CSR spmv性能为0.378721 Gflops,使用9个线程
  • 浮动CSR spmv性能为0.354885 Gflops,使用10个线程
  • 浮动CSR spmv性能为0.328653 Gflops,使用11个线程
  • 浮动CSR spmv性能为0.31173 Gflops,使用12个线程
  • 浮动CSR spmv性能为0.302341 Gflops使用13个线程
  • 浮动CSR spmv性能为0.281349 Gflops,使用14个线程
  • 浮动CSR spmv性能为0.273103 Gflops,使用15个线程
  • 浮动CSR spmv性能为0.26132 Gflops,使用16个线程
  • 浮动CSR spmv性能为0.238776 Gflops,使用17个线程
  • 浮动CSR spmv性能为0.218346 Gflops,使用18个线程
  • 浮动CSR spmv性能为0.210184 Gflops,使用19个线程
  • 浮动CSR spmv性能为0.19734 Gflops,使用20个线程

    顺便说一句,我正在使用gcc编译 -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl

    任何帮助将不胜感激。感谢。

0 个答案:

没有答案