OpenMP和MKL线程

Dam*_*oon 6 fortran openmp intel-mkl

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

Hri*_*iev 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中线程数的更多信息,请参阅MKL的用户指南.