我在 Fortran 中有一个代码,它使用DGESVD
MKL 并使用 Intel 编译器在 8 个内核上运行。代码通过 OpenMP 加速。我也知道 OpenMP 和 MKL 有自己的设置来设置线程数(omp_num_threads
和mkl_num_threads
)。我想知道最佳线程数。我应该OMP_NUM_THREADS=1
在调用 LAPACK 例程之前设置吗?OpenMP 线程数会影响 MKL 线程数吗?
问问题
6173 次
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 回答