fermi架构下好像已经支持浮点模型ieee854了,但是好像编译器支持最广泛的的是ieee754标准吧,我想问下为了保证与vc2008的浮点运算计算结果一样,是需要调整nvcc的编译器参数呢,还是需要调整vc2008的参数呢?还是说由于gpu上浮点寄存器达不到cpu上的80位,根本就不可能达到cpu目前的精度?
ps:vc下浮点模式好像是可调的,分为precise、fast、strict,cuda里面关于浮点精度的东东是不是只可以选择是否采用fast_math?
为了提高精度好像还有Kahan’s Summation Formula这种方法,但是这个好像是针对加法和减法的吧,乘法和除法有没有类似可以提精度算法呢?
对了,最后说一句,我的程序目前已经是双精度了,但是感觉还是精度有些不够
LZ您好:
1:您的“fermi架构下好像已经支持浮点模型ieee854了,但是好像编译器支持最广泛的的是ieee754标准吧”,表示fermi支持的是IEEE 754-2008,以及IEEE 854标准并没有定义真正的浮点数格式,以及IEEE 754 2008基本涵盖了所有IEEE 754-1985和IEEE 854-1987的内容。
所以您这个问题前提结论什么的对不上,无法回答。
2:“我想问下为了保证与vc2008的浮点运算计算结果一样,是需要调整nvcc的编译器参数呢,还是需要调整vc2008的参数呢?”,这个无法保证的,涉及浮点运算的有限精度和运算顺序等,也和编译参数以及误差截断方式有关。近期多个帖子都讨论过,您不妨看看。
以及,这个和编译参数,硬件,等因素有关,和VS2008无关,您的GPU的代码和CPU的代码都可以使用VS 2008作为IDE的,CPU代码和GPU程序的host端代码都可以使用VS2008自带的编译器的。
3:“还是说由于gpu上浮点寄存器达不到cpu上的80位,根本就不可能达到cpu目前的精度?”差别的原因,上文和其他近期帖子多有讨论呢。
值得指出的是,CPU代码仅有在使用X87指令的时候,是80bit精度的,如果使用其他SIMD的指令,并无这么高精度,以及一般无FMA支持(除了最新的一些X86的CPU),所以此时中间步骤的截断精度还不如GPU。
以及,CPU结果并不代表精确结果,仅代表一种浮点运算结果,请辩证地看待这一点。
以及,都采用一样的圆整方式,一样的中间过程精度,因为浮点运算的不可组合性,CPU的结果依然不能保证和GPU结果完全一致。
4:GPU浮点运算精度信息请参阅Programming guide。有单双精度和fast math精度的说明。
5:不清楚乘除法有否类似Kahan’s Summation Formula的方法,无法回答您。
6:无法对您的程序的精度作出评价,请见谅。
大致如此,以上各点供您参考。
祝您编码顺利~
“因为浮点运算的不可组合性”这一点理论上是没错的,但是我的程序有些特殊,你可以认为一个每一个线程与其他线程都没有关系,核函数的计算步骤也完全与cpu代码一致。
ps:浮点运算的不可组合性一般体现在累加这种操作上吧。我认为目前这类的代码我完全没有向gpu进行移植,进行移植的部分都是数据无关的,而且计算步骤也完全与cpu代码一致。在移植完成之后,我甚至对单步的运行结果进行了比对,发现二者差值小于1e-15,但是运行个比如100步之后,积累的效果就出来了,(我实现的是一种迭代算法)gpu端的程序残差无法向cpu程序那样顺利的下降。就是说比如cpu程序在400步时的结果与401步时的结果只是在2范数意义下相差了1e-10,但是gpu程序在400步时的结果与401步时的结果在2范数意义下却相差了1e-2.
再问一下,1个double型的数据在gpu显存上和cpu用的内存上表示为二进制是一样的吗(基于我上面提到开发平台)?
LZ您好:
1:““因为浮点运算的不可组合性”这一点理论上是没错的,但是我的程序有些特殊,你可以认为一个每一个线程与其他线程都没有关系,核函数的计算步骤也完全与cpu代码一致。”请您自己保证即可,我无法凭空预测您的算法的。
2:无法理解您的“数据无关”的含义,以及因为不懂您的算法,亦无法告知您您的代码误差积累的原因。请见谅。
3:您以为二进制表示是否一样呢?(既然他们都遵循同样的规范,以及是同一个确定的浮点数。)
大致如此,祝您编码顺利~
“既然他们都遵循同样的规范”,就是说同一个double型的数在二进制表示上肯定是一样吧,计算结果的不同只是来源与计算指令具体实现的不同吧?
LZ你好:
同一个确定的浮点数,在都遵循相同规范(IEEE 754)的平台上,二进制表示必然是一样的。IEEE 754标准精确指出了每个bit应该怎么写。
以相同的初始数据出发,经过同样种类的计算,得到的结果有所不同,那么这取决于计算精度、中间步骤保留精度和圆整方式等的差异。
以及您迭代若干步以后的结果,还和您的算法的误差积累性质有关。
大致如此,供您参考。
祝您编码顺利~