主页 › 博客 ›

关于科学计算中的数值误差问题

作者: 甘驰 (Intel) (16 篇文章) 日期: 一月 26, 2010 在 3:51 下午

最近看到有开发HPC应用的程序员反映换了编译器后,新程序的结果不正确。我不禁想起20年前在16位IBM PC AT/XT台式机上开发CAD/CAM程序, 程序在计算边界状况时,如两圆柱的轴夹角为1分求交线,结果经常匪夷所思,都是精度惹得祸。进入64bit时代同样的问题仍然存在,单次运算的精度提高了,但HPC程序中的大量的迭代计算,累积了误差,导致结果不同。我读了Intel同事的文章(http://software.intel.com/en-us/articles/consistency-of-floating-point-results-using-the-intel-compiler),略有所得,与大家分享。

人们要求结果的复现性有以下几方面,
-同一程序,同一数据集,执行若干次的结果相同(近)
-同一代码,不同编译选项产生的程序,相同的数据集,执行的结果相同(近)
-同一代码,不同编译器产生的程序,相同的数据集,执行的结果相同(近)
-同一代码,相同的数据集,在不同架构的CPU上执行的结果相同(近)
最好运行速度也要快。这些要求有时是相互矛盾的。让我们先分析计算结果有差别的原因,注意这里我用了差别,而不是误差。

首先,通常十进制的浮点数用二进制数表示时就有误差,便有了‘原罪’。

其二,计算机运算是不符合结合律的,如A+B+C不一定等于A+(B+C)。当A= -B且C为极小值时,A+B+C=C,但A+(B+C)=0,极小值C和B相加时由于精度限制,被忽略了或者说表示B的有效位不能包含C的值;但A+B=0,再加C后,结果为C。当你多线程或多进程化程序运行时,原来的数据被切成几分,分给不同的进程/线程执行,于是原先的次序被打破,用MPI或OpenMP的程序都有引入的这类潜在的结果差别。

其三,X87 FPU是以80位(1位符号,15位指数,64位数值)、扩展双精度浮点数运算的。SIMD执行单元可能不是(查遍手册,未见答案,至少其数据是以64位存放的)。

其四,四舍五入,(a) 1.0001 0000 1000 0011 1001 0111E2 101以单精度数表示时需要四舍五入,因为其数值有25位,超过单精度浮点数的24位。根据系统设置,有四种模式可选,
-Round to nearest (even) --- 选精度误差最小的
-Round down (toward −∞) -- 选精度误差最小的, 但不大于原数
-Round up (toward +∞) --选精度误差最小的, 但不小于原数
-Round toward zero (Truncate) --选精度误差最小的, 但其绝对值不大于原数

其五,Flush-to-zero 和 denormal-to-zero. 如设定flush-to-zero, 当浮点运算发生underflow时,返回0值而不是像IEEE754要求的,返回非正规数据(denormalized data),这主要是为了提升性能。Denormal-to-zero是将非正规数据操作数置零,也是为性能。

其六,不良的编程习惯。如变量不置初值等

我的同事将随后发如何巧用Intel编译器的选项避免结果差别,和如何发现导致结果差别的代码。

分类: 并行计算, 英特尔® 软件网络 2.0

关于科学计算中的数值误差问题相关推荐

  1. 全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.Python 会有哪些最为独特的优势呢?又存在哪些让开发者无力的缺陷?在本文中,我们将 ...

  2. python应用实例论文_浅谈Python在科学计算中的应用

    55 SYS PRACTICE 系统实践 有效的计算工具能为工作提高效率,Python 在实际工作与 科学调研中等运用的也越来越广泛,通过专家不断的研究与分 析,通过 Python 进行科学计算是再合 ...

  3. python 对比matlab_全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    原标题:全面对比 MATLAB.Julia.Python,谁在科学计算中更胜一筹? 数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.P ...

  4. matlab 与 python 在科学计算中的区别比较

    本文以求解拟一维喷管流动为例,比较两者在科学计算中的区别. 感受:matlab矩阵实验室在求解矩阵方面具有得天独厚的优势,尤其是在矩阵之间的运算方面.求解方程过程中,能够明显感觉到编程给人带来的快感, ...

  5. matlab在数值计算中的应用,详解MATLAB在科学计算中的应用

    详解MATLAB在科学计算中的应用 编辑 锁定 讨论 上传视频 <详解MATLAB在科学计算中的应用>是2011年电子工业出版社出版的图书,作者是陈泽占海明. 书    名 详解MATLA ...

  6. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  7. matlab hilb,MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础

    <MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础>由会员分享,可在线阅读,更多相关<MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础(7 ...

  8. python 矩阵运算 for循环_如何用Python科学计算中的矩阵替代循环?

    比如求一个平面稳态导热问题,控制方程就是拉普拉斯方程: (我才发现原来有[插入公式]这个功能) 按照最简单的毅种循环来写就是: def laplace(u): nx, ny = u.shape for ...

  9. python中ndarray除_python科学计算_numpy_ndarray

    ndarray:n-dimensional array object,即多维数组对象,是python自带的array对象的扩展,array对象和list对象的区别是array对象的每一个元素都是数值, ...

最新文章

  1. 人生苦短,我用python+vscode
  2. 解决if-else的另一种姿势:Map + 函数式接口方法!
  3. 机器学习实战:TypeError: unhashable type: 'matrix'
  4. Error - Found cycle in the ListNode
  5. vue添加html开启服务器_vue服务端渲染添加缓存
  6. OpenCV_cv::Mat的深拷贝 浅拷贝问题
  7. 使用HBuilderX软件快速搭建Vue项目
  8. 盛金公式解一元三次方程_用盛金公式求解一元三次方程
  9. html中选择器是什么意思,css选择器是什么意思?
  10. PHP语言编程魔方,编程和魔方
  11. ubuntu18.04 network有线网络图标缺失解决记录
  12. Android开发经验、能力提升
  13. Django POST CSRF verification failed. Request abor
  14. Linux 多种方式实现文件共享
  15. 【财经】同程网 -- 盈利模式
  16. [攻略] 球会6 特殊战术(FORMATION COMBO)一览
  17. 透澈心灵的清泉——中台赋能让快鱼更快
  18. PDF如何旋转页面以及替换页面
  19. 《JavaScript 实战》:实现图片幻滑动展示效果
  20. 解决微软Conrtana(小娜)搜索结果为空 | 搜索不到应用的问题

热门文章

  1. 光耦w314的各引脚图_常见光耦的引脚及内部结构图
  2. kb931125—rootsupd_微软kb931125根证书更新程序
  3. 9158的屌丝经济学:城市白领不是我们的用户群
  4. 如果光速会变,并不绝对,物理学将一夜回到400年前
  5. 使用Adobe Acrobat DC对.jpg和.png格式图片转换为.eps图片格式举例
  6. SitePoint播客#152:芬兰对面
  7. 基于JSP的网上服装销售系统
  8. 科学并不等于实验 南瓜科学给出全新答案
  9. XML和JSON的区别
  10. 《React Native 精解与实战》已发售,附 80 集配套免费视频教程