首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP OpenBLAS嵌套并行

OpenMP OpenBLAS嵌套并行
EN

Stack Overflow用户
提问于 2019-03-10 01:53:56
回答 1查看 388关注 0票数 0

我们正在尝试并行运行两个cblas_dgemm实例。如果线程总数是16,我们希望每个实例使用8个线程运行。目前,我们使用的结构如下:

代码语言:javascript
复制
#pragma omp parallel num_threads(2)
{
   if (omp_get_thread_num() == 0){
     cblas_dgemm(...);
   }else {
     cblas_dgemm(...);
   }
}

以下是问题所在:

在顶层,有两个OpenMP线程,每个线程在一个if/else块中都是活动的。现在,我们期望这些线程调用cblas_dgemm函数是并行的,并且在这些cblas_dgemm函数中,我们期望产生新的线程。

为了设置每个cblas_dgemm内部的线程数,我们设置了相应的环境变量: setenv OPENBLAS_NUM_THREADS 8但是,它似乎不工作。如果我们测量每个并行调用的运行时,运行时值是相等的,但当不使用嵌套并行性并且环境变量OPENBLAS_NUM_THREADS设置为1时,它们等于单个cblas_dgemm调用的运行时。

哪里出了问题?我们怎样才能得到想要的行为呢?我们有没有办法知道cblas_dgemm函数中的线程数?

非常感谢您的时间和帮助

EN

回答 1

Stack Overflow用户

发布于 2019-03-11 15:23:49

您尝试使用的机制称为“嵌套”,即在外部现有并行区域中创建新的并行区域已处于活动状态。虽然大多数实现都支持嵌套,但默认情况下它是禁用的。尝试在命令行中设置OMP_NESTED=true,或者在代码中的第一个OpenMP指令之前调用omp_set_nested(true)

我还会将上面的代码改为如下所示:

代码语言:javascript
复制
#pragma omp parallel num_threads(2)
{
#pragma omp sections
#pragma omp section
    {
        cblas_dgemm(...);
    }
#pragma omp section
    {
        cblas_dgemm(...);
    }
}

这样,代码也将只使用一个线程来计算正确的内容,序列化对dgemm的两个调用。在只有一个线程的示例中,代码将会运行,但会错过第二个dgemm调用。

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

https://stackoverflow.com/questions/55080295

复制
相关文章

相似问题

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