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/
Intel MKL 多线程设置的更多相关文章
- Intel MKL函数,如何得到相同的计算结果?【转】
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...
- 在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理
在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理 直接在NVIDIA(CUDA,CUBLAS)或Intel MKL上进行高度定制和优化的BERT推理,而无需tenso ...
- ubuntu配置机器学习环境(四) 安装intel MKL
在这一模块可以选择(ATLAS,MKL或者OpenBLAS),我这里使用MKL,首先下载并安装英特尔® 数学内核库 Linux* 版MKL,下载链接, 请下载Student版,先申请,然后会立马收到一 ...
- Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll
Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ...
- 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法
运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...
- Intel MKL(Math Kernel Library)
1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ...
- BLAS 与 Intel MKL 数学库
0. BLAS BLAS(Basic Linear Algebra Subprograms)描述和定义线性代数运算的规范(specification),而不是一种具体实现,对其的实现包括: AMD C ...
- 使用由 Intel MKL 支持的 R
我们通常使用的 R 版本是单线程的,即只使用一个 CPU 线程运行所有 R 代码.这样的好处是运行模型比较简单且安全,但是它并没有利用多核计算.Microsoft R Open(MRO,https:/ ...
随机推荐
- my.宠物升级79级
1.蚌仙子 74级半不到的时候,吃 月华露(500000经验的那种) 吃3个 正好 79级半 我记得 之前 是升满75级 再吃月华露 到79级的时候 经验溢出了.不突破还好,突破的话 宠物就升级了 ...
- 移动测试之appium+python 环境安装(一)
准备工作 一.Python安装 下载地址 及环境变量配置 注意:安装时候记得勾选上Add python.exe to Path.这可以省略环境变量配置. 如果没有勾选,安装下边操作 找到path环境变 ...
- 解决“<form>提交,CSRF验证失败。请求中止”
在相应的提交页面,内,添加"{%csrf_token%} ",如: Django工程的app文件的views.py添加屏蔽装饰器,(相应的函数上): from django.vie ...
- Unity3d 破解
在官网上或者其他地方下载unity3d后 运行注册机,需要详细的设置可以点击edit 一.点击browse,选择安装unity目录下的Editor文件夹 二.选择path,会提示Pathed 三. ...
- leetcode 196. Delete Duplicate Emails 配合查询的delete
https://leetcode.com/problems/delete-duplicate-emails/description/ 题意要对原来的数据表进行删除,不删除不行,它每次只输出原来那个表. ...
- Unity C# ref与out
ref和out 都是按地址传递的,使用后都将改变原来的数值.ref 方法参数关键字使方法引用传递到方法的同一个变量.当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 r ...
- Javascript学习一Object
构造函数 new Object() new Object(value) 参数 value 可选的参数,声明了要转换成Number对象.Boolean对象或String对象的原始值(即数字.布尔 ...
- js获取日期:前天、昨天、今天、明天、后天
前天,昨天,今天,明天,后天 <html> <head> <meta http-equiv="Content-Type" content=" ...
- VS2013 自定义项目模板以及制作.vsix文件
一.环境检查 打开VS2013新建项目.如果在"其他项目类型"中不包含扩展性节点,则需要下载并安装vs2013 SDK. 二.创建项目模板 1,在VS中新建一个类库项目(此处仅以类 ...
- SQLSERVER 2012的多维数据库浏览 ,不能多维的显示
网上搜索后发现,原来ssms2012不支持这种方式,要使用Excel的方式 参考地址:http://www.flybi.net/question/12567