- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 努力奋斗 NUIST HPC使用讲座 ——运算结果的一致性问题 刘建宇 2015-04-21 * !!!声明!!! 这里仅对浮点运算一致性问题做了一些初略的介绍 目的是希望让大家对结果的一致性有个概念 可能有不全面或不足之处 仅供参考,谨慎使用 3/Public/floating-point.pdf * 实验重复不了? * 为什么得到不同的结果 大多数涉及浮点数的计算结果中具有固有的不确定性 计算应用一般需要具有 准确度 可重复性 性能 这些目标通常是冲突的 大多数看起来普通的小数并不能用有限长度的二进制数来确切表述 不同的硬件设计对浮点运算的实现不同 * 浮点数在计算机内部的表示 数的十进制与二进制的表示方法 13.625= 1x101 + 3x100 + 6x10-1 + 2x10-2 + 5x10-3 13.625=1x23 + 1x22 + 0x11 + 1x10 + 1x2-1 + 0x2-2 + 1x2-3 * 浮点数在计算机内部的表示 IEEE (国际电子电器工程师协会) 754标准 用符号(正或负)、指数和尾数来表示,底数被确定为2 F=(-1)^S * M * 2^E 尾数的表示(二进制) 1.xxxxxxxxxxxxx 纯小数的表示 b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n ) 0.4≈0*0.5+1*0.25+1*0.125+0*0.0625+…… 类型 符号 指数 尾数 总位数 小数位数(log2^n) 半精度 1 5 10 16 ~3.3 单精度 1 8 23 32 ~7.2 双精度 1 11 52 64 ~15.9 X86扩展精度 1 15 64 80 ~19.2 四精度 1 15 112 128 ~34 * 影响浮点运算结果一致的因素 不同的优化设置会导致不同的浮点运算结果 为了保证计算的精度,处理器内部都会采用更高的精度,例如 Intel X86 的处理器内部采用80-bit 内存中双精度浮点数为64-bit 不同的优化级别对CPU与内存之间的浮点数处理有影响 当使用O2或以上级别时,编译器将会启用乘加运算指令(fmadd),这对浮点数运算的精度是有影响的 有些高级别的优化并不严格遵从IEEE754浮点数规则 有些看似相同的组优化选项,即使是相同的编译器,在不同版本之间的优化也是不一样的,例如, -fast -ipo, -O3, -no-prec-div, -static, and -xHost 对于在相同架构下不同类型CPU可以采用编译器浮点精度控制选项来尽量获得浮点运算结果的逐位一致性 在不同编译器之间没有可以完全一致映射的选项 AIX -qfloat=nomaf -qstrict=precision GNU -ffloat-store -fno-fast-math -ffp-contract=off (C only) PGI -Mnofprelaxed -Kieee -Mnofpaprox ( C only ) Intel -fp-model precise -no-fma -fimf-arch-consistency=true * 影响浮点运算结果一致的因素 不同的编译器会导致不同的运算结果 解析表达式的顺序不一样 (A+B)+C ≠A+(B+C) program testprec real(8) :: rhov2, e_ltnt, etrans, vib_en, erot, etfun rhov2= 0.4246880000000000109E+04_8 e_ltnt= -0.1281190399897235288E+02_8 etrans= 0.3774588278644195327E+01_8 vib_en= 0.8256235492705331022E-04_8 erot= 0.2516391330176059871E+01_8 etfun = .5d0 * rhoV2 + e_ltnt + etrans + vib_en + erot WRITE(*,(e26.19)) etfun end program testprec 代码使用-g -O0编译及在Intel Xeon CPU的结果:
文档评论(0)