Intel MKL 多线程设置
对于多核程序,多线程对于程序的性能至关重要。 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍:
我们提到MKL 支持多线程,它包括的两个概念:
1>MKL 是线程安全的: MKL在设计时,就保证它是一个线程安全的库函数。 也就是说,无论是在单个线程中调用MKL函数,还是在多个线程中同时使用Intel MKL 函数,都能够确保函数有正确的计算结果。
2>MKL函数内部实现了多线程优化。许多MKL的函数,已经包括内部多线程的实现。用户调这些函数时,只需设置多线程的数目,MKL 函数的内部,就可以同时进行多个线程的并行计算。 Intel MKL 还提供了一个单线程版本的库函数,这个版本中,每个函数只运行串行代码。 我们需要在链接的时候,需要选择链接串行(单线程)的MKL函数,还是并行(多线程)的MKL 的函数。 下面我们提到的多线控制的方法,主要是针对的并行的MKL函数库。
那么,在MKL 的多线程库中, 如何设置MKL 多线程的数目呢? Intel MKL 使用了OpenMP实现了多线程,所以OpenMP的环境变量与API对MKL 的多线程设置仍然有效。 除了OpenMP的方法外,MKL还提供了,其它的设置多线程的环境变量与API:
环境变量 | 对应的API | 说明 | 对于的OMP的变量 |
MKL_NUM_THREADS | mkl_set_num_threads | 建议MKL 函数使用的多线程的数目。. | OMP_NUM_THREADS |
OMP_NUM_THREADS | omp_set_num_threads | OpenMP提供的多线程设置的环境变量与API. | |
MKL_DYNAMIC | mkl_set_dynamic | 建议MKL根据计算问题,自动设置多线程的数目,线程数目不超过用户设定的线程的上限 | OMP_DYNAMIC |
需要说明的是,Intel MKL 提供的多线程设置的方法,优先级要高于OpenMP的方法。 比程序中,同时设置了下面的环境变量:
>export MKL_NUM_THREADS =1
>export OMP_NUM_THREADS =4
此时,程序中,MKL的函数将会运行一个线程。
关于多线程的设置,我们还需要注意下面的3个问题:
第一,在超线程的机器上,Intel MKL 多线程的设置: 在系统中,当多个线程的执行不同的操作,CPU有空闲资源时,多线程技术有较好的执行效果。Intel MKL的计算核心已经经过充分优化,并且这些计算的核心都执行类似的计算操作,所有多线程的设置,对于MKL 不能提供很好的帮助。 如果在程序执行的机器上, 超线程的设置已经打开, 一个推荐的做法是,设置MKL 的线程为系统核的数目(逻辑处理器数目的一半),并设置下面的threading affinity 的环境变量:
KMP_AFFINITY=granularity=fine,compact,1,0.
第二,MKL_DYNAMIC 环境变量: 这个环境变量确定是否由Intel MKL 来选择计算的线程的数目, 但是总的线程数不会超过MKL_NUM_THREADS与OMP_NUM_THREADS的值。 Intel MKL会根据实际计算问题的大小,以及多线程对计算是否有效等诸多情况,选择适合的线程数目,这也是缺省的Intel MKL 多线程设置方式。
如果用户手动设置MKL_DYNAMIC=FALSE, Intel MKL 将根据用户指定的线程数目,设置计算线程。 比如,设置:
MKL_DYNAMIC=FALSE
MKL_NUM_THREADS=6
MKL函数将运行6个计算线程,尽管对某些小的计算问题,6个线程可能并不是最有效的。
第三,并不是所有MKL函数都是多线程。 某些计算函数,多线程并不能给程序带来性能提升,如Level 1 BLAS,其主要计算瓶颈是数据访问,这样的函数,内部多线程,不能带来很大帮助。 具体的MKL 多线程的函数列表, 可以查看用户手册。
有关多线程这方面的,进一步的参考文档:
MKL 用户手册:http://software.intel.com/sites/products/documentation/hpc/mkl/mkl_userguide_lnx/index.htm
相关文章:
http://software.intel.com/en-us/forums/showthread.php?t=67622
http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-intel-mkl-100-threading/
http://software.intel.com/en-us/articles/setting-thread-affinity-on-smt-or-ht-enabled-systems/