8

我在 Fortran 中有一个代码,它使用DGESVDMKL 并使用 Intel 编译器在 8 个内核上运行。代码通过 OpenMP 加速。我也知道 OpenMP 和 MKL 有自己的设置来设置线程数(omp_num_threadsmkl_num_threads)。我想知道最佳线程数。我应该OMP_NUM_THREADS=1在调用 LAPACK 例程之前设置吗?OpenMP 线程数会影响 MKL 线程数吗?

4

1 回答 1

16

MKL 还使用 OpenMP 作为其多线程驱动程序。这意味着 OpenMP 线程的数量确实会影响 MKL 线程的数量,但方式非常复杂。

首先,作为 OpenMP 代码,MKL 也由通常的 OpenMP 方法控制,以设置线程数,例如OMP_NUM_THREADS调用omp_set_num_threads. 但它也提供了MKL_NUM_THREADS和形式的覆盖配置机制mkl_set_num_threads()。这允许在用户代码和 MKL 例程中拥有不同数量的线程。

在配置了所需的线程数之后,还应该知道 MKL 在嵌套并行情况下的行为方式。parallel也就是说,如果从用户代码中的活动区域内部调用,MKL 默认会运行单线程。MKL 提供了MKL_DYNAMIC可以覆盖此行为的开关,但它要求用户代码使用与 MKL 相同的 OpenMP 编译器(请阅读 - 您必须使用英特尔的编译器),因为不保证不同 OpenMP 运行时之间的兼容性。

一般来说,您不需要在调用 MKL 之前将线程数设置为 1,因为这将使其成为单线程,除非通过显式配置 MKL 线程数被覆盖。parallel当启用嵌套并行时,从内部区域调用它时应该小心。

MKL 的用户指南中提供了有关控制 MKL 中的线程数的更多信息:

于 2012-12-09T11:13:58.933 回答