对于多核程序,多线程对于程序的性能至关重要。 下面,我们将对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 多线程设置的更多相关文章

  1. Intel MKL函数,如何得到相同的计算结果?【转】

    在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同. 事实上,程序往往很难保证做到这一点. 为什么呢? 我们先看一个简单的例子: 当程序 ...

  2. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  3. 在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理

    在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理 直接在NVIDIA(CUDA,CUBLAS)或Intel MKL上进行高度定制和优化的BERT推理,而无需tenso ...

  4. ubuntu配置机器学习环境(四) 安装intel MKL

    在这一模块可以选择(ATLAS,MKL或者OpenBLAS),我这里使用MKL,首先下载并安装英特尔® 数学内核库 Linux* 版MKL,下载链接, 请下载Student版,先申请,然后会立马收到一 ...

  5. Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 在使用Anaconda创建一个虚拟环境出来,然后安装了scikit-learn.nump ...

  6. 遇到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问题. 解决方法:打开 ...

  7. Intel MKL(Math Kernel Library)

    1.Intel MKL简介 Intel数学核心函数库(MKL)是一套高度优化.线程安全的数学例程.函数,面向高性能的工程.科学与财务应用.英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内 ...

  8. BLAS 与 Intel MKL 数学库

    0. BLAS BLAS(Basic Linear Algebra Subprograms)描述和定义线性代数运算的规范(specification),而不是一种具体实现,对其的实现包括: AMD C ...

  9. 使用由 Intel MKL 支持的 R

    我们通常使用的 R 版本是单线程的,即只使用一个 CPU 线程运行所有 R 代码.这样的好处是运行模型比较简单且安全,但是它并没有利用多核计算.Microsoft R Open(MRO,https:/ ...

随机推荐

  1. 转 PYTHON2 编码处理-str与Unicode的区别

    https://www.cnblogs.com/long2015/p/4090824.html

  2. 分布式思想和rpc解决方案介绍

    1.RPC的诞生 RPC(Remote Procedure Call)远程过程调用,通过这个rpc协议,调用远程计算机上的服务,就像调用本地的服务一样. 不同的服务部署在不同的机器上面,并且在启动后在 ...

  3. java多线程(二)

    线程的阻塞状态: 参考java多线程(一)多线程的生命周期图解,多线程的五种状态.     1.1 join(),如果在A线程体里面执行了B线程的join()方法,那么A线程阻塞,直到B线程生命周期结 ...

  4. python单元测试框架-unittest(三)之用例执行顺序

    执行顺序规则: 测试类或测试方法的数字与字母顺序0~9,A-Z 执行如下脚本,理解用例执行顺序 #coding=utf-8 import unittest class Test1(unittest.T ...

  5. windows 7下安装MySQL5.6

    一. 软件下载 从MySql官网上下载响应的版本,我的是5.6.17. 二.安装过程 以管理员权限运行安装程序,收集信息. 选择安装MySql产品,如果之前有安装过,那么就选择更新了. 同意Licen ...

  6. apache2.2多域名绑定

    apache2.2多域名绑定不同目录,将代码放在httpd.conf最后 NameVirtualHost *:80 <VirtualHost *:80> ServerName wo.com ...

  7. DetachedCriteria用法

    http://uule.iteye.com/blog/947923转载 在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查 ...

  8. gdb调试汇总

    1. 启动GDB开始调试: (1)gdb program ///最常用的用gdb启动程序,开始调试的方式(2)gdb program core ///用gdb查看core dump文件,跟踪程序cor ...

  9. ORACLE 查看表空间

    select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_spacefrom dba_data_files ...

  10. MySQL中的information_schema

    information_schema 数据库是MySQL自带的,可看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类 ...