首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MKL中调用cblas_sgemm时如何避免fork-join?

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

Stack Overflow用户
提问于 2016-03-08 17:29:44
回答 1查看 176关注 0票数 0

代码如下:

代码语言:javascript
复制
for(int i = 0; i < loop_count; i++)
   cblas_sgemm(<paras group A>);

当矩阵不是很大时,fork-join开销非常明显,特别是在MIC上运行时。此外,手动分离任务会在麦克风上造成一些问题,如MKL Performance on Intel Phi所示。

代码语言:javascript
复制
  //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>);

如果有一种我可以使用代码的技术:

代码语言:javascript
复制
  #pragma omp parallel
  for(int i = 0; i < loop_count; i++)
    cblas_sgemm(<paras group A>);

其中cblas_sgemm使用从for循环派生的线程,因为MKL还使用OpenMP来创建线程。

诚心的,FatRabb1t。

EN

回答 1

Stack Overflow用户

发布于 2016-04-24 04:20:42

您可以通过链接MKL的顺序版本来做到这一点,这样cblas_sgemm就不会派生多个线程来计算矩阵。

另一方面,你可以使用OpenMP parallel for来加速你的代码。

代码语言:javascript
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35863573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档