首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenMP拆分LAPACK调用

使用OpenMP拆分LAPACK调用
EN

Stack Overflow用户
提问于 2013-01-18 08:08:22
回答 1查看 1.9K关注 0票数 2

我正在对我编写的一个例程进行代码调优,其中一部分执行两个可以同时完成的矩阵乘法。目前,我在第一个DGEMM和第二个DGEMM上调用DGEMM(从Intel的MKL库)。这将在每次调用时使用我机器上的所有12个内核。我希望它同时执行两个DGEMM例程,每个例程使用6个内核。我感觉这是一件简单的事情,但还没有找到/理解如何实现这一点。我遇到的主要问题是,OpenMP必须从一个线程调用DGEMM例程,但每次调用都可以使用6个线程。哪条指令最适合这种情况?它需要嵌套的语用标记吗?

因此,作为更一般的说明,我如何将核心(在我的例子中为12个)划分为多个集合,然后从一个使用其集合中所有线程的线程中运行一个例程。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-01-18 21:55:32

你能做的最接近的事情就是让一个由两个线程组成的团队执行一个OpenMP并行区域,然后从每个线程调用MKL。您必须在MKL中启用嵌套并行(通过禁用动态线程),将MKL线程的数量固定为6,并且必须使用英特尔的编译器套件来编译代码。MKL本身是使用OpenMP线程的,但它是英特尔的OpenMP运行时。如果您碰巧使用另一种编译器,例如GCC,它的OpenMP运行时可能会被证明与英特尔的不兼容。

由于您没有指定语言,我提供了两个示例-一个用Fortran,一个用C/C++:

Fortran:

代码语言:javascript
复制
call mkl_set_num_threads(6)
call mkl_set_dynamic(0)

!$omp parallel sections num_threads(2)
!$omp section
   call dgemm(...)
!$omp end section
!$omp section
   call dgemm(...)
!$omp end section
!$omp end parallel sections

C/C++:

代码语言:javascript
复制
mkl_set_num_threads(6);
mkl_set_dynamic(0);

#pragma omp parallel sections num_threads(2)
{
    #pragma omp section
    {
        cblas_dgemm(...)
    }
    #pragma omp section
    {
        cblas_dgemm(...)
    }
}

一般来说,你不能为MKL创建线程的子集(至少在我目前的理解中是这样)。每个DGEMM调用将使用全局指定数量的MKL线程。请注意,MKL操作可能会针对CPU的缓存大小进行调整,并且并行执行两个矩阵乘法可能没有好处。如果您的NUMA系统有两个六边形CPU,每个CPU都有自己的内存控制器(我怀疑这就是您的情况),那么您可能会这样做,但是您必须注意数据放置的位置,并启用线程到内核的绑定(锁定)。

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

https://stackoverflow.com/questions/14390423

复制
相关文章

相似问题

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