Intel MKL函数,如何得到相同的计算结果?

huaqmffpy 2012-06-06 02:26:17
加精
在运行程序时,我们总希望多次运行的结果,是完全一致,甚至在不同的机器与不同的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%的性能开销。

相关培训材料: http://software.intel.com/en-us/articles/conditional-bitwise-reproducibility/

下载与测试Intel MKL 11.0 Beta:

原文地址:http://g.csdn.net/5221746
...全文
473 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LAONINGA098 2012-06-13
  • 打赏
  • 举报
回复
学习,谢谢分享。
xiying12571 2012-06-10
  • 打赏
  • 举报
回复
不错,学到很多东西
modyaj 2012-06-10
  • 打赏
  • 举报
回复
分享就不错了
叶子 2012-06-07
  • 打赏
  • 举报
回复
学习,谢谢分享。
Rd.Gao 2012-06-07
  • 打赏
  • 举报
回复
谢啦谢啦
「已注销」 2012-06-07
  • 打赏
  • 举报
回复
怎么回事啊 2012-06-06
  • 打赏
  • 举报
回复
小白顶顶顶那个idngdi
xunxun 2012-06-06
  • 打赏
  • 举报
回复
lz是Chao Y?

不过感觉这一篇不像他写的
tenglong821103 2012-06-06
  • 打赏
  • 举报
回复
不错!!
tjycx 2012-06-06
  • 打赏
  • 举报
回复
不错,学到很多东西
好奇君 2012-06-06
  • 打赏
  • 举报
回复
很好的内容 学到很多很多。
zhan750520 2012-06-06
  • 打赏
  • 举报
回复
感谢分享!

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧