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