对于多核程序,多线程对于程序的性能至关重要。 下面,我们将对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/
分享到:
相关推荐
加载sklearn库有可能遇到Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 问题,解决卸载掉numpy,scipy,sklearn三个库重新安装,资源的版本为py35,cpu,64位,全程分别为numpy-1.15.4+mkl-cp35-cp35m-win_...
intel MKL开发手册,OpenBLAS接口参考说明,都是同一套接口,非常有用,接口使用说明可以在这里查阅.
intel mkl 's license
intel Math Kernel Library(intel MKL)机器学习 深度学习 百度云下载
MKL Intel 英特尔数学核心库提供经过高度优化和大量线程化处理的数学例程,面向性能要求极高的科学、工程及金融等领域的应用。
Intel开源MKL计算库,说明文档,详细说明函数调研与配置情况。
Intel(R)用于深层神经网络的数学内核库(Intel(R)MKL-DNN)是一个用于深度学习应用程序的开源性能库...Intel(R)MKL-DNN包含了矢量化和线程化的构建块,您可以使用它来实现带有C和C++接口的深层神经网络(DNN)。
intel 数学库9.1 for windows(32) 动态库和静态库文件。。。
英特尔-mkl-src 箱crate.io 描述英特尔-mkl-src 英特尔MKL的源板条箱英特尔-mkl-sys 用于Intel-MKL 和FFI 英特尔-mkl工具 用于重新分发Intel-MKL的CLI实用程序将英特尔MKL重新包装为板条箱。 在Linux,macOS和...
Intel数学核心函数库(MKL)是一套经过高度优化的、线程安全的数学例程、函数,并在此基础上加入了在Linux集群环境下的ScaLAPACK,它们专门针对计算性能要求很高的科学、工程及金融等领域的应用程序而设计。...
mkl-dnn, 用于深神经网络的Intel(R) 数学内核库( 英特尔( R ) ) MKL 英特尔的mkl仓库迁移到 https://github.com/intel/mkl-dnn 系统。 旧地址将继续可用,并将重定向到新的repo 。 请更新你的链接。用于深神经网络( ...
英特尔 MKL-DNN 是一个开源的性能增强库,能够提高在英特尔架构上运行的深度学习框架的速度。对深度学习感兴趣的软件开发人员可能听说过英特尔 MKL-DNN,但是有可能未曾使用过它。 英特尔 MKL-DNN 教程系列的开发...
Intel MKL官方编程手册
intel mkl 2018 参考手册 cintel mkl 2018 参考手册 c
采用的是MKL实现方程组的求解,主要是使用LU分解的方法,MKL实现的求解速度比自己写的要快很多。
WIN下英特尔数学核心函数库 2018(32位),带有.h与.lib文件,可方便程序调用
通过一个简单的脚本将英特尔MKL添加到Debian / Ubuntu系统
MKL 10.0 用户指南 ,希望对想快速属性MKL的朋友有帮助
mkl_intel_ilp64.lib库文件