通过阅读英特尔MKL文档和这些文章(Calling multithreaded MKL in from openmp parallel region),我的理解是将OpenMP并行化构建到您自己的代码中,除非使用英特尔编译器构建,否则MKL内部OpenMP for MKL函数(如DGESVD
或DPOTRF
)是不可能的。例如,我有一个大型线性系统,我想用MKL解决,但我也想利用并行化来构建系统矩阵(我自己的代码独立于MKL),在同一个二进制可执行文件中。
英特尔在MKL文档中声明第三方编译器“可能必须禁用多线程”以用于MKL功能。所以选项是:
#pragma omp ...
等)和单线程调用MKLgcc
,所以不是我的选项)当然,MKL附带了它自己的openmp build libiomp*
,gcc
可以链接到它。除了MKL函数之外,是否可以使用此库来实现自己代码的并行化?我假设将涉及一些线程的直接管理。但据我所知,MKL中没有包含iomp
dev头文件,可以回答这个问题( - > NO)。
所以在这一点似乎唯一的答案是英特尔TBB(线程构建模块)。只是想知道我是否遗漏了某些东西,或者是否有一个聪明的解决方法。
(编辑:)另一个解决方案可能是,如果MKL有一个接口来接受自定义C ++ 11 lambda函数或其他任意代码(例如,包含嵌套for循环),可以通过任何内部线程方案进行并行化。到目前为止,我还没有见过这样的事情。
英特尔TBB还将实现更好的嵌套并行性,这在某些情况下可能会有所帮助。如果要使用MKL启用GNU OpenMP,可以使用以下选项:
mkl_rt
库然后
在加载MKL之前设置env var MKL_THREADING_LAYER=GNU
或者致电mkl_set_threading_layer(MKL_THREADING_GNU);
mkl_gnu_thread
。