OpenMP和MKL线程

时间:2012-12-08 23:52:39

标签: fortran openmp intel-mkl

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

1 个答案:

答案 0 :(得分:12)

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

首先,作为OpenMP代码,MKL也由通常的OpenMP方式控制,以设置线程数,例如OMP_NUM_THREADS并致电omp_set_num_threads。但它还以MKL_NUM_THREADSmkl_set_num_threads()的形式提供覆盖配置机制。这允许用户代码和MKL例程中具有不同数量的线程。

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

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

MKL's User Guide中提供了有关控制MKL中线程数的更多信息。