在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的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. 设置隐藏activity的标题栏

    values->styles.xml中设置:stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBa ...

  2. C# 使用命令行编译单个CS文件

    编译单个CS文件. 1.编译   File.cs   以产生   File.exe:       csc   File.cs     2.编译   File.cs   以产生   File.dll:  ...

  3. Android异步更新UI的四种方式

    Android异步更新UI的四种方式 2015-09-06 09:23 segmentfault 字号:T | T 大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中 ...

  4. 2016 - 1- 22 Build a Nav bar (intro to HTML&CSS)

    一:Learn how to build a NavBar --- allow user navigate ur site 1. The hypetext refrence link This att ...

  5. RTL2832U+R820电视棒跟踪飞机轨迹教程(ADS-B)

    Ubuntu 14.04.3 amd64 apt-get install git apt--dev 安装rtl-sdr git clone git://git.osmocom.org/rtl-sdr. ...

  6. vim1

    Vim模式介绍 几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数的编辑器使用了与Vim接入不同的方式:命令目录(鼠标或者键盘驱动),组合键(CTRL和ALT组成)或鼠标输入.Vim和vi一样, ...

  7. BZOJ 3531(树链剖分+线段树)

    Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...

  8. Qt的QLineEdit显示密码

    ui->lineEdit->setEchoMode( QLineEdit::Password );

  9. /cdrom /media /mnt

    /media : Mount point for removeable media Purpose This directory contains subdirectories which are u ...

  10. jQuery关于Select的操作

    jQuery获取Select选择的Text和Value: 1. var checkText=jQuery("#select_id").find("option:selec ...