我正在为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.19734 Gflops,使用20个线程
顺便说一句,我正在使用gcc编译 -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
任何帮助将不胜感激。感谢。