找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 296|回复: 2

CPU和GPU处理浮点数时,处理同一个浮点式子的运算 ,两者之间有差异吗?如果有,怎...

[复制链接]
发表于 2018-5-11 17:44:19 | 显示全部楼层 |阅读模式
ESC4000G3
CPU和GPU处理浮点数时,处理同一个浮点式子的运算 ,两者之间有差异吗?如果有,怎么来的?

回复

使用道具 举报

发表于 2018-5-11 18:30:16 | 显示全部楼层
Jetson TX2
CPU和GPU都只能处理编译后的指令的,而不是原始代码的“式子”。

如果一个表达式被正确的编译后,现在的CPU和GPU执行上无区别的。

不要有GPU精度低之类的说法,这些说法往往来自于历史原因导致的偏见。

历史偏见1:我在32-bit系统上编译的XXXX代码,精度更好,和我手工计算的结果非常接近。GPU偏差较大。
回复1:很多老编译器在默认为32-bit应用生成代码的时候,使用x87指令,很多时候内部具有80-bit的浮点数,此时在GPU上使用float和double均不如它的精度好。
解决方案:改用新版的64-bit系统和新版的编译器。他们将默认使用SSE/AVX指令,结果和将GPU的结果非常一致。

历史偏见2:我注意到了1这点了。我的应用是64-bit的,编译器也很新,但是结果和GPU的相差较大(我没有比较手算结果)。
回复2:这是因为很多时候GPU有更高的精度。该更高的精度总是来自两点, GPU上总是默认使用FMA,CUDA编译器此时提供了更好的a * b + c操作的中间精度,而很多CPU不支持FMA,损失精度。其次,GPU算法往往是并行的,很多时候浮点数操作并行比串行具有更好的精度(例如请考虑对一串浮点数的串行加法,CPU上往往加到最后就会出现大数吃小数,丢失有效数据的问题; 而GPU上经过并行后,你不自觉的就使用了类似对半累加之类的高精度计算方式。此时GPU精度更好)。
解决方案2:抛弃CPU精度更高的错误观念。

所以CPU和GPU的确可能有些许差异,但目前我们的GPU都符合IEEE-754规范,所读写的数据格式完全一样,误差范围也符合要求。因此无需疑神疑鬼,而且如上所述,很多时候GPU精度更好。

如果你真的对精度有非常非常严格的要求(部分科学计算,金融行业),你应当使用10进制浮点数(可以有效的表示圆、角、分、厘等),128-bit浮点数或者任意精度之类的库来执行你的代码。这些是通过整数来模拟的。现在的N卡整数性能也不错,依然比CPU更适合这些运算。

屠戮人神
回复 支持 反对

使用道具 举报

发表于 2018-5-11 22:10:53 | 显示全部楼层
Tesla P100
屠戮人神 发表于 2018-5-11 18:30
CPU和GPU都只能处理编译后的指令的,而不是原始代码的“式子”。

如果一个表达式被正确的编译后,现在的 ...

感谢大神热心解答,学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表