代码是这样的:
for(int i = 0; i < loop_count; i++)
cblas_sgemm(<paras group A>);
当矩阵不是很大时,fork-join成本非常明显,特别是当它在MIC上运行时。此外,手动分离任务会导致MIC出现问题MKL Performance on Intel Phi。
//separate the left and result matrix by hand.
//not a wise solution on MIC
#pragma omp parallel
for(int i = 0; i < loop_count; i++)
cblas_sgemm(<paras group B>);
如果有技术我可以使用代码:
#pragma omp parallel
for(int i = 0; i < loop_count; i++)
cblas_sgemm(<paras group A>);
其中cblas_sgemm使用从for循环中分叉出来的线程,因为MKL也使用OpenMP来创建线程。
此致,FatRabb1t。
答案 0 :(得分:0)
你可以通过链接MKL的顺序版本来做到这一点,这样cblas_sgemm
就不会分叉多个线程来计算矩阵。
另一方面,您可以使用OpenMP parallel for
加速代码。
#pragma omp parallel for
for(int i = 0; i < loop_count; i++)
cblas_sgemm(<paras group B>);
通过这种方式,您只需将线程加入一次而不是loop_count
次。
如果您使用的是英特尔编译器icc/icpc
,则可以将顺序MKL与编译器选项-mkl=sequential
而不是-mkl
链接起来。
如果您使用的是其他编译器,例如gcc
,则可以使用MKL链接线顾问来帮助您生成所需的链接线选项。
https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor