加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 从openmp并行区域调用多线程MKL

发布时间:2020-12-15 04:16:29 所属栏目:Java 来源:网络整理
导读:我有一个具有以下结构的代码 #pragma omp parallel{ #omp for nowait { // first for loop } #omp for nowait { // first for loop } #pragma barrier -- #pragma omp single/critical/atomic -- not sure dgemm_(....) #pragma omp for { // yet another fo
我有一个具有以下结构的代码

#pragma omp parallel
{
    #omp for nowait
    {
        // first for loop
    }

    #omp for nowait 
    {
        // first for loop
    }

    #pragma barrier 

    <-- #pragma omp single/critical/atomic --> not sure 
    dgemm_(....)

    #pragma omp for
    {
        // yet another for loop  
    }

}

对于dgemm_,我链接多线程mkl.我希望mkl使用所有可用的8个线程.这样做的最佳方法是什么?

解决方法

这是嵌套并行性的一种情况.它受MKL支持,但仅当您的可执行文件是使用Intel C/C++编译器构建时才有效.这种限制的原因是MKL使用Intel的OpenMP运行时,并且不同的OMP运行时彼此不能很好地运行.

一旦整理完毕,您应该通过将OMP_NESTED设置为TRUE来启用嵌套并行性,并通过将MKL_DYNAMIC设置为FALSE来禁用MKL检测嵌套并行性.如果要共享要与dgemm_进行处理的数据,则必须在单个构造中调用后者.如果每个线程处理自己的私有数据,那么您不需要任何同步构造,但使用多线程MKL也不会给您带来任何好处.因此,我认为你的案子是前者.

总结一下:

#pragma omp single
dgemm_(...);

并运行:

$MKL_DYNAMIC=FALSE MKL_NUM_THREADS=8 OMP_NUM_THREADS=8 OMP_NESTED=TRUE ./exe

您还可以使用适当的调用设置参数:

mkl_set_dynamic(0);
mkl_set_num_threads(8);
omp_set_nested(1);

#pragma omp parallel num_threads(8) ...
{
   ...
}

虽然我更愿意使用环境变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读