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_THREADSmkl_set_num_threads建议MKL 函数使用的多线程的数目。.OMP_NUM_THREADS
OMP_NUM_THREADSomp_set_num_threadsOpenMP提供的多线程设置的环境变量与API. 
MKL_DYNAMICmkl_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 用户手册:/sites/products/documentation/hpc/mkl/mkl_userguide_lnx/index.htm
相关文章:
/en-us/forums/showthread.php
/en-us/articles/intel-mkl-10x-threading
/en-us/articles/setting-thread-affinity-on-smt-or-ht-enabled-systems-for-better-performance
有关编译器优化的更完整信息,请参阅优化通知
类别: