在MKL中调用cblas_sgemm时如何避免fork-join?

时间:2016-03-08 09:29:44

标签: c openmp icc intel-mkl xeon-phi

代码是这样的:

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。

1 个答案:

答案 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