使用GCC编译的多线程MKL + OpenMP

问题描述 投票:0回答:1

通过阅读英特尔MKL文档和这些文章(Calling multithreaded MKL in from openmp parallel region),我的理解是将OpenMP并行化构建到您自己的代码中,除非使用英特尔编译器构建,否则MKL内部OpenMP for MKL函数(如DGESVDDPOTRF)是不可能的。例如,我有一个大型线性系统,我想用MKL解决,但我也想利用并行化来构建系统矩阵(我自己的代码独立于MKL),在同一个二进制可执行文件中。

英特尔在MKL文档中声明第三方编译器“可能必须禁用多线程”以用于MKL功能。所以选项是:

  1. openmp并行化您自己的代码(标准#pragma omp ...等)和单线程调用MKL
  2. 多线程调用MKL函数,以及其他地方的单线程代码
  3. 使用英特尔编译器(我想使用gcc,所以不是我的选项)
  4. 将您的代码和MKL与英特尔TBB并行化? (不确定这是否有效)

当然,MKL附带了它自己的openmp build libiomp*gcc可以链接到它。除了MKL函数之外,是否可以使用此库来实现自己代码的并行化?我假设将涉及一些线程的直接管理。但据我所知,MKL中没有包含iomp dev头文件,可以回答这个问题( - > NO)。

所以在这一点似乎唯一的答案是英特尔TBB(线程构建模块)。只是想知道我是否遗漏了某些东西,或者是否有一个聪明的解决方法。

(编辑:)另一个解决方案可能是,如果MKL有一个接口来接受自定义C ++ 11 lambda函数或其他任意代码(例如,包含嵌套for循环),可以通过任何内部线程方案进行并行化。到目前为止,我还没有见过这样的事情。

c++ gcc openmp tbb intel-mkl
1个回答
2
投票

英特尔TBB还将实现更好的嵌套并行性,这在某些情况下可能会有所帮助。如果要使用MKL启用GNU OpenMP,可以使用以下选项:

  • Dynamically Selecting the Interface and Threading Layer。链接到mkl_rt库然后 在加载MKL之前设置env var MKL_THREADING_LAYER=GNU 或者致电mkl_set_threading_layer(MKL_THREADING_GNU);
  • Linking with Threading Libraries直接(但是,链接没有明确提到GNU OpenMP)。当您构建库,插件或扩展模块(例如Python的包)时,不建议这样做,它可以与可能以不同方式使用MKL的其他组件混合使用。链接到mkl_gnu_thread
© www.soinside.com 2019 - 2024. All rights reserved.