+ -
当前位置:首页 → 问答吧 → 请问TITAN的精确度浮点运算是什东西

请问TITAN的精确度浮点运算是什东西

时间:2013-05-30

来源:互联网

在做物理模拟时使用CPU或GPU计算的结果会不太一样,GPU常常会不太准确
像我自己常在做的流体模拟,如果改成用GPU算的话果就会怪怪的,跟CPU算的整个不一样(但整个飞快欲罢不能)

不过TITAN的介绍中有提到精确度浮点运算跟双精确度浮点运算这两个东西可以做科学运算
意思是用TITAN的话就可以得到跟CPU一样的结果吗?

作者: vox0097   发布时间: 2013-05-30

NVIDIA GTX TITAN 游戏、运算二合一,打造全新产品线

这是比较简单的网页解释

基本上电脑运算中带有小数的数字就叫浮点数
而浮点数分两种
一种叫单精度
一种叫双精度(单精度的2倍)
精度越高 误差越小
使用CPU运算一定可以使用双精度运算
但因为执行绪数目的关系 通常很慢
使用显卡运算 执行绪超多 所以超快
但大部分的显卡都只提供单精度运算 高阶显卡或专门用於科学运算的显卡 才会提供双精度
Nvidia的话是Titan,AMD是Tahiti系列核心

<<以下内容错误 自行删文>>

以上是我的见解,还请板上的高手指教

作者: x225089x   发布时间: 2013-05-30

x225089x wrote:
这里说的误差是电脑上数字表达的误差,不是楼主所提供的公式中的误差
简单而言,电脑没办法准确表达0.1这个数值(很有名的就是0.1连加10次不等於1)
这是需要额外去校正的,也就是文中提到的ECC校正
CPU的运算通常会有(记忆体要特别挑一下,或是使用的程式语言自己会去较正)
ECC是用来防止记忆体出错的,就算全部用整数下去运算也会需要ECC。
另外,我只听过rounding mode,没听过有人会额外去校正数值的误差
能否告知更详细的资讯?

另外回应楼主的问题,double precision需要Compute Capability 1.3以上才能使用。
而且你还需要确认rounding mode的设定或者是该软体是否有使用低精准度的方程式(fast sin or cos)

作者: rgly   发布时间: 2013-05-30

rgly wrote:
ECC是用来防止记忆...

恩 看来ECC这块我真的错了
谢谢指正

另外 我想表达的就是rounding mode 这可能存在於code里面
不过是软体面的 应该跟硬体无关 这里我又错了
像是
power(sqrt(3.45), 2)←开根号后平方

sqrt(3.45) * sqrt(3.45)←根号后相乘 答案不相同
不过这算是软体面的需要去校正就是了
这东西就要看会是一连串需要校正的地方
谢谢指正

不过用单精度来计算双精度的东西
是可以肯定会存在误差
而在一连串的计算之后
就会产生失准的问题

我先去面壁一下了...

作者: x225089x   发布时间: 2013-05-30


x225089x wrote:
另外 我想表达的就是rounding mode 这可能存在於code里面
不过是软体面的 应该跟硬体无关 这里我又错了
我总觉的你讲的rounding mode 跟我讲的好像是不同的东西
我下面直接贴出官方CUDA3.2文件的内容
All compute devices follow the IEEE 754-2008 standard for binary floating-point arithmetic with the following deviations:
● There is no dynamically configurable rounding mode; however, most of the
operations support multiple IEEE rounding modes, exposed via device
intrinsics;
● There is no mechanism for detecting that a floating-point exception has
occurred and all operations behave as if the IEEE-754 exceptions are always
masked, and deliver the masked response as defined by IEEE-754 if there is an
exceptional event; for the same reason, while SNaN encodings are supported,
they are not signaling and are handled as quiet;

x225089x wrote:
像是
power(sqrt(3.45), 2)←开根号后平方

sqrt(3.45) * sqrt(3.45)←根号后相乘 答案不相同

以下是我用python算出的结果:
>>> math.sqrt(3.45)
1.857417562100671
>>> math.sqrt(3.45)**2
3.45
>>> math.sqrt(3.45)*math.sqrt(3.45)
3.45
不知道你是用什么软体去算的。

作者: rgly   发布时间: 2013-05-30

我没写过CUDA的code
所以我是以我写JAVA的经验来说明的
不过应该是我自己的code问题啦

那公式是余弦相似度计算,用於计算两文章之间的相似性
值会在0~1之间
过程中会有多次的递回计算
因此会有多个变数被我存下来
而当两者在最后要相除的时候 明明该是全等的1 确可能会产生0.99与1.01这种问题
这问题还满常发生的
不过换个语言就不太有这种问题
像是matlab之类的,或许跟语言对浮点数的处理也有关吧
我所想表达的情况
类似这篇当中的 - 误差的产生及传播:截尾及离散化误差 这部分的情况

https://zh.wikipedia.org/wiki/%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90

而楼主所需要的计算 或许也会需要多次的数值储存 在多次递回后就有可能产生这种现象

round-off error跟rounding mode不同 我错看
所以我的跟你看的rounding mode认知真的不一样

另外就是单精度舍入误差的值会比起双精度要多的
这样计算的结果 肯定会差距更大
而我想表达的校正就是在这几点上面
请问这东西的有办法校正吗?
更深入的东西 请原谅我的一知半解

作者: x225089x   发布时间: 2013-05-30

谢谢各位大大解惑,其实看完文章再看其他留言,整个直冒汗...
好像比我事先想的又复杂太多XDD
还是等有钱的时候直接去败一块测看看

作者: vox0097   发布时间: 2013-05-30


vox0097 wrote:
在做物理模拟时使用C...

应该不用TITAN就可以开倍精度浮点运算了(在GTX480时我就看过测试软体测试这方面的能力)

更前面的GTX200系列就没支援

你的问题应该是软体没启动或支援这方面的功能

如果可以询问软体开发商或是看说明书会比较清楚

作者: guardxd   发布时间: 2013-05-30