代码如下:
for(int i = 0; i < loop_count; i++)
cblas_sgemm(<paras group A>);当矩阵不是很大时,fork-join开销非常明显,特别是在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。
发布于 2016-04-24 04:20:42
您可以通过链接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=sequential而不是-mkl来链接顺序的MKL。
如果您正在使用其他编译器,如gcc,您可以使用MKL link line advisor来帮助您生成所需的链接行选项。https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
https://stackoverflow.com/questions/35863573
复制相似问题