Intel MKL函数,如何得到相同的计算结果?【转】
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的OS中,程序运行的结果每一位都完全相同。
事实上,程序往往很难保证做到这一点。 为什么呢? 我们先看一个简单的例子: 当程序使用单精度或者双精度的浮点数时, 浮点数有一定的精度的限制。 单精度的浮点数,使用23位二进制表示的尾数。 双精度浮点数,使用52位的二进制(http://en.wikipedia.org/wiki/IEEE_754-1985)。
如果,程序中计算下面的表达式:
double d1,d2,d3,d4,d5;
d1 = 1e-63;
d2 = 1;
d3= -1;
d4 = (d1+ d2) +d3;
d5 = d1+ (d2 +d3);
printf("d4=%e\n",d4);
printf("d5=%e\n",d5);
通常,它的结果为:
d4=0.000000e+000
d5=1.000000e-063
尽管数学表达上, d4 应该有和d5 完全相同的计算结果。但是,由于浮点数的有限精度,(d1+d2),在计算机的值为1. 最终,d4,d5的结果并不完全相同。
如果程序调用Intel MKL 函数,下面的一些因素,往往会对我们的计算结果产生影响:
1> 内存对齐:我们的处理器往往提供了一些专门的指令,对16 byte 或 32 byte (AVX ) 对齐内存地址进行存取操作。 当程序运行时,对齐或不对齐输入数据的地址,运行的代码可能有略微差别。最终,程序的计算结果,可能不是完全一致。
2> 多线程的设置: Intel MKL 函数已经是多核优化后的函数,程序运行多线的数目不同,带来相应的数值精度上也会细微的误差。
3> 针对不同处理器的优化代码: Intel MKL 能够充分利用处理器的指令集,来取得程序的最高性能。 这样在不同的处理器上, 程序运行的代码可能并不是完全一致,从而最终的的结果,可能也略有差别。
新的MKL 11.0提供了conditional bitwise reproducible (CBWR)的特性。 在满足一定的条件下,它能保证MKL函数有相同的结果。如果 1)输入/输出的数据地址按照16或 32字节对齐 ( 选择执行SSE指令需要16 byte 对齐,AVX1指令32 byte 对齐)2)运行的线程数目相同 3)在同一可执行文件中被调用, 那么Intel MKL函数可以在多次执行中,有相同的计算结果。
程序不同处理器上运行的时候,可能运行不同的优化代码。比如, 在较旧Intel® Pentium® 4 处理器上, MKL可能运行SSE2 优化代码,而在支持的AXV指令的新的机器上,MKL 的函数可能运行AVX指令的优化代码。 这样,Intel MKL函数能够根据不同处理器的特性,提供高效的优化代码。但是,当这些代码,有不完全相同的数据处理顺序时,不完全一致的代码可能产生的最有的数值结果可能也不完全一致。 在MKL 11.0 中, 提供的一些新的函数,与环境变量。能够帮助用户来来控制取得一致的计算结果。
下面我们看一下例子:
1> 为确保在Intel 以及Intel 兼容的支持SSE2 指令的处理上,有一致的计算结果, 我们可以将程序须设置固定的线程数目, 保证输入输出数据的地址对齐, 并调用以下的MKL 函数:
mkl_cbwr_set(MKL_CBWR_COMPATIBLE) 或设置环境变量:MKL_CBWR_BRANCH = "COMPATIBLE"
2>在支持SSE4.1 Intel 的处理器上, 为确保MKL 函数有相同的结果。我们可以将程序须设置固定的线程数目,保证输入输出数据的地址对齐, 并调用以下的MKL 函数:
mkl_cbwr_set(MKL_CBWR_SSE4_1) 或设置环境变量: MKL_CBWR_BRANCH = "SSE4_1"
需要说明的是, 如果我们选择了特定CPU优化的代码, 很自然,针对一些新的处理器,MKL 可能会有一些性能开销。 比如,对于矩阵与矩阵乘法的函数(xGEMM), AVX 优化代码的性能有近乎SSE2优化代码的两倍性能。在支持AVX机器上,我们指定,该函数运行SSE2的代码,会有不少的性能损失。对于其他的一些例子,选择特定的优化代码,可能有10%-20%的性能开销。
相关培训材料: /en-us/articles/conditional-bitwise-reproducibility
下载与测试Intel MKL 11.0 Beta:
来源:https://software.intel.com/zh-cn/blogs/2012/05/22/intel-mkl-2
Intel MKL函数,如何得到相同的计算结果?【转】的更多相关文章
- Intel MKL函数之 cblas_sgemm、cblas_sgemm_batch
cblas_sgemm int m = 40; int k = 20; int n = 40; std::vector<float> a(m*k, 1.0); std::vector< ...
- Intel MKL 多线程设置
对于多核程序,多线程对于程序的性能至关重要. 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念:1>MKL 是线程安全的: MKL ...
- 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 ...
- 【神经网络与深度学习】【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 ...
- 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问题. 解决方法:打开 ...
- ubuntu配置机器学习环境(四) 安装intel MKL
在这一模块可以选择(ATLAS,MKL或者OpenBLAS),我这里使用MKL,首先下载并安装英特尔® 数学内核库 Linux* 版MKL,下载链接, 请下载Student版,先申请,然后会立马收到一 ...
随机推荐
- jQuery get post 碎片(远程html)加载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- centos7的网络配置以及设置主机名和绑定IP的问题
CentOS 7.0系统是一个很新的版本哦,很多朋友都不知道CentOS 7.0系统是怎么去安装配置的哦,因为centos7.0与以前版本是有很大的改进哦. 说明:截止目前CentOS 7.x最新版本 ...
- 生成1~n的全排列
输入正整数n,输出n的全排列. 样例输入1: 3 样例输出1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 分析: 按字典序从小到大的顺序输出所有的排列. (字典序:两个序 ...
- 三极管的妙用之C118自动刷机
首先咱们要搞清楚咱们自动刷机的原理,不谈修改固件那么高深的东西,简单的就是控制开机键. 使用继电器来控制基本上算是上个世纪的想法吧,之前博主也做过,做出来的感觉其实也很不错,就像是一个收藏品.因为继电 ...
- 中文Ubuntu系统根目录文件夹名称变为英文
Ubuntu中文安装后,家目录均为中文,如“下载” “文档”等等,在使用Shell时很不方便,可用如下方法将这些文件夹名称改回英文 1.使用命令 export LANG=en_US xdg-user- ...
- HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)
题意:给N个容器,每个容器里有一定数目的珍珠,现在Jerry开始在管子上面再放一些珍珠,放上的珍珠数必须是K的倍数,可以不放.最后将容器排序,如果可以做到第i个容器上面有i个珍珠,则Jerry胜出,反 ...
- 【LEETCODE OJ】Copy List with Random Pointer
Problem link: http://oj.leetcode.com/problems/copy-list-with-random-pointer/ Deepcopy a linked list ...
- C语言基础:进制转换,变量,常量,表达式,基本数据类型,输出函数,输入函数,运算符. 分类: iOS学习 c语言基础 2015-06-10 21:39 25人阅读 评论(0) 收藏
二进制:以0b开头,只有0和1两种数字.如0101 十进制:0~9十个数字表示.如25 十六进制:以0~9,A~F表示,以0X开头.如0X2B 十进制转换为X进制:连除倒取余 X进制转换为十进制:按权 ...
- Chocolate_DP
Description In 2100, ACM chocolate will be one of the favorite foods in the world. "Green, oran ...
- IE6如何定义1px左右高度的容器?
<!doctype html><html> <head> <meta charset="UTF-8"> <meta name= ...