在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的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函数,如何得到相同的计算结果?【转】的更多相关文章

  1. 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< ...

  2. Intel MKL 多线程设置

    对于多核程序,多线程对于程序的性能至关重要. 下面,我们将对Intel MKL 有关多线程方面的设置做一些介绍: 我们提到MKL 支持多线程,它包括的两个概念:1>MKL 是线程安全的: MKL ...

  3. Intel MKL(Math Kernel Library)

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

  4. BLAS 与 Intel MKL 数学库

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. win10下安装centOS 7 U盘

    前段时间我把朋友帮忙装的ubuntu15.10给玩坏了=.=虽然后来自己在另一台电脑上成功装了ubuntu16.04和win7双系统,但是...这台电脑也要装个别的系统才比较..不空.所以决定装个ce ...

  2. 二、XML约束

    XML约束有dtd约束和Schema约束两种 dtd约束:可以在xml内部写dtd约束也可以在xml中引用外部dtd文件 book.dtd<!ELEMENT 书架 (书+)>    < ...

  3. 通过AssetsLibrary框架访问所有相片

    该框架下有几个类,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation. ALAssetsLibrary ...

  4. BZOJ 3163 Eden的新背包问题

    分治背包+单调队列优化. 但是为什么maxn要1w多?...不怎么懂. #include<iostream> #include<cstdio> #include<cstr ...

  5. Blocks_DP&&矩阵快速幂

    参考资料:http://www.tuicool.com/articles/beiyAv [题意]有n块砖.现要将砖全部染上红.蓝.绿.黄四种颜色.要求被染成红色和绿色的砖块数量必须为偶数,问一共有多少 ...

  6. DIV+CSS设计IE6浮动产生双倍距离

    <!doctype html><html><head> <meta name="Keywords" content="" ...

  7. HDU 3605

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 用最大流做的,G++超时,C++可以过,看别人写的叫二分图多重匹配,还不会这玩意一会学学 显然的最大流模型 ...

  8. 【转】CSS3 transition规范的实际使用经验

    原文转自:http://blog.jobbole.com/56243/ 本篇文章主要讲述CSS3 transition规范和在不同浏览器之间的使用差异,关于具体解决方法或如何规避问题的意见可以参考另一 ...

  9. 利用HTML5云存储实现模拟对比投票效果

    <!DOCTYPE HTML> <html> <head> <title>模拟对比投票效果</title> <meta name=&q ...

  10. 让IE9支持html5

    IE10以上才算是真正支持了html5 ,但仍然有些地方和别的浏览器不一致,比如要在js里移除一个html标签, 如果是IE,document.getElementById("a" ...