情况:
我也完成了一段CPU程序,然后将CPU程序转换成为GPU程序。程序需要算大概3w-5w步。
算了三个算例:
(1)网格布局161616:CPU程序和GPU程序都可以算出来。结果一致。
(2)网格布局323232:不同机器的CPU结果有的一致,有的不一致;GPU和CPU均会在某一步出错,但出错时间步不一致。
(3)网格布局646464:情况同(2)
机器1:台式机 win7 64位系统 Intel i7 GTX580显卡 VS2010中文版 cuda4.2
机器2:笔记本 win7 64位系统 Intle ******M显卡(待补充完整) VS2010中文版 cuda4.2
机器3:服务器1 server2008系统 Intel 950 VS2008英文版
机器4:服务器2 server2008系统 Intel 930 VS2008英文版
综上: 机器1 和机器2 可以算CPU和GPU程序; 机器3和机器4只算CPU程序。
目前GPU程序在之前版大的指导下,外围的错误已经改好。虽然GPU出现错误,也是因为CPU计算也有错的原因。所以GPU本身的错误个人认为已经消除。
而错误的产生,个人觉得是计算精度造成的(下面有例证)
详细描述下目前的问题,以下描述的情况均是针对 323232的测试来说。
(1)一模一样的CPU程序(完整一样,粘贴复制的程序),放在 机器1 机器3 机器4 这三台机器运行。、
发现:机器3和机器4运算结果完全一致(所有结果都一模一样),均是在 5309步出错。 (计算无论哪个参数的计算结果小数点后都一致)
机器1和 机器3、4不一致。在11329步出错。
我选取了一个特征数brnm为例。如下图,左边为机器1的结果, 右边卫机器3、4的结果。可以看到前3步计算的完全一致。从第四步起小数点末端计算有不一致的地方。也正是因为这些不一致,导致了机器1 和机器3、4 计算结果不同。 机器11329步才出错,而机器3、4在5309就错了。
[attach]3040[/attach]
(2)在机器1上运行 CPU程序和GPU程序, 是在不同步数上出错的。 (这点的具体情况待补充,因为远程的电脑挂了,待回去再详细整理)
目前对于我的程序,无论是CPU还是GPU,个人觉得整体上没有什么大问题,如果有,也是因为计算过程的不收敛导致或者求解矩阵不收敛等原因。
因此,单纯从精度上去考虑,精度造成(1)(2)的不一致, 请问各位可以给予一些指点和指引!
再次拜谢了!
(如果需要小弟补充说明或者测试,请直接告诉,我会尽快测试以更加有利于各位的判断和指点)
于2013清明假期最后一个寒夜
您还是说明下是什么算法吧。目前光这样。什么都看不出的。
程序比较大,大概蕴含以下算法:
(1)取邻域值来作为差插分、插值的数据: 比如(i,j)时候,需要取(i-1,j) (i+1,j) (i,j-1) (i,j+1)
(2)Ax=b 的矩阵求解x (双共轭梯度法)
简单的说就是这些算法。
我的疑惑是 CPU程序, 机器3、4结果完整一致, 但是和机器1不一致。
(我的截图是为了证明机器3、4结果 和机器1 前3步算的一致,从第四部开始小数点末端就不一致,有误差了)求问误差原因。
首先,float数据类型的有效数字就只有6位(即超过6位的部分,都可能是随机的,没什么意义)。
其次,相同型号的CPU可能处理出相同的随机数,但这并不说明这些随机数是对的或者有意义的。
我分配的都是double,无float类型。
只是pintf输出 是用的是 fprintf(fp, “ brnm2= %f\n”,brnm2);
请问这样也会出现您说的这个问题吗?
这个我不清楚,没这么试过。现在手头没机器。你可以试下。
另外,建议楼主先睡觉,明天再尝试~
手机大致看了下文字叙述,您描述的情况似乎是积累误差造成的,当然很多算法避不开积累误差。
而为何同样的程序,台式机和工作站结果不同,我估计有可能是编译情况不同造成的。您可以尝试将工作站上编译好的可执行文件拿到台式机上看看。
如果您的算法有积累误差,并且对误差敏感,那么GPU和CPU结果有差异很正常,又很多原因可以导致浮点结果有差异的。(手机党打字不易,回头再说)
祝您神清目明编码顺畅!
恩呢 好呢!!
谢谢您 提到的编译好的exe 这个意见。
我回到办公室后再进行测试。
也劳烦明天方便上网时候再给予进一步解释。3ks
听您一贯的,准备睡了!您也早睡~
ICE的建议你试验了么?
其实ICE想告诉你,你得用同样的exe在不同的CPU上运行,得出的结果才有可比较性。
否则你的试验无法控制单一变量,比较无意义。
(CPU变了,但是你也重新编译了,编译的参数也变了。无意义了)
以及,CPU上,采用sse还是x87指令算,采用何种rounding控制,等因素,均会导致您的CPU结果不一致。
但是,一旦您是固定的一个程序(exe), 那么这些因素是固定的,所以我不认为您通过换CPU, 就可以看到结果差异。
建议尝试ICE昨夜1点的建议。
LZ您好,横扫斑竹在12#详细说明的即为我的本意,感谢横扫斑竹进一步解释说明,建议LZ控制变量,尝试一下。
祝您好运~
善哉,因为这个是惯常的控制单一变量以寻找问题的方法。
祝您调试顺利~
向ice大 横大进行汇报。
经过采用exe测试和仔细排查。
发现错误的不一致的原因是 因为 我在机器1 采用的是 debug模式生成的exe。 而机器3、4采用的是exe。
我重新测试如下:
当以上几台机器均采用realse的时候结果一样,都是5908步出现不收敛现象。
当以上几台机器均采用debug的时候结果一样,都是11329步出错不收敛现象。
因此进一步深入的请教,这个如何处理?
如果在最常用的硬件CPU上,依然出现“不收敛”,那么只能说,
您的算法/实现有问题。您需要自己排查下。而无万能回复。
您觉得呢?
您说的是。
关于我程序的不收敛我自行再进一步测试,比如减少步长等。
我想问 导致debug 和 realse 结果的不同,这个正常吗? 我该相信哪一个?
LZ您好,这个测试结果说明我们控制单一变量的做法是成功的。
确定的exe文件在不同的机器上的运行结果是一致的,这说明您的问题不是机器出现随机故障造成的,而是某种确定的行为。
至于算法不收敛,作为有积累误差的数值方法或者迭代方法,这个是常见的,您只能从算法本身去寻找解决方案。最后的代码实现,只能尽量选择圆整误差小的方法,而不能本质上解决。
祝您好运~