用GCC编译的多线程MKL + OpenMP

时间:2019-02-14 21:27:25

标签: c++ gcc openmp tbb intel-mkl

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

英特尔在MKL文档中指出,第三方编译器“可能必须禁用MKL功能的多线程”。因此,选项为:

    您的代码的
  1. openmp并行化(标准#pragma omp ...等)和对MKL的单线程调用
  2. 仅对MKL函数的多线程调用,以及其他任何地方的单线程代码
  3. 使用Intel编译器(我想使用gcc,所以不是我的选择)
  4. 通过Intel TBB同时实现您的代码和MKL吗? (不确定是否可行)

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

因此,在这一点上似乎唯一的答案就是英特尔TBB(线程构件)。只是想知道我是否缺少某些东西,或者是否有一个聪明的解决方法。

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

1 个答案:

答案 0 :(得分:2)

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

  • Dynamically Selecting the Interface and Threading Layer。链接到mkl_rt库,然后链接
    • 在加载MKL之前先设置环境变量MKL_THREADING_LAYER=GNU
    • 或致电mkl_set_threading_layer(MKL_THREADING_GNU);
  • Linking with Threading Libraries直接(尽管该链接未明确提及GNU OpenMP)。当您构建库,插件或扩展模块(例如Python的软件包)时,不建议使用此方法,这些库,插件或扩展模块可以与可能使用MKL的其他组件混合使用。链接到mkl_gnu_thread