我在Fortran中有一个代码,它使用MKL中的DGESVD
并使用英特尔编译器在8个内核上运行。代码通过OpenMP加速。另外我知道OpenMP和MKL有自己的设置来设置线程数(omp_num_threads
和mkl_num_threads
)。我想知道最佳线程数。我应该在调用LAPACK例程之前设置OMP_NUM_THREADS=1
吗? OpenMP线程的数量是否影响MKL线程数?
答案 0 :(得分:12)
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编译器(读取 - 必须使用Intel的编译器),因为不同的OpenMP运行时之间不保证兼容性
一般来说,在调用MKL之前,您不需要将线程数设置为1,因为这会使其成为单线程,除非通过显式配置来覆盖MKL线程的数量。当启用嵌套并行性时,在parallel
区域内调用它时应该小心。
MKL's User Guide中提供了有关控制MKL中线程数的更多信息。