用户
 找回密码
 立即注册
yuhuilcm 该用户已被删除
发表于 2013-11-26 13:30:01
2165013
本帖最后由 yuhuilcm 于 2013-11-26 13:31 编辑

    在实现一个算法的过程中,由于涉及到double数据的多次循环相乘并迭代求和,结果却在debug模式下能得到正确的结果,在release模式得到的结果却有差异,调试发现在迭代到某一次的时候,在小数点后10为的时候出现1个单位的差异导致后面数据迭起产生不同 结果。在这里请问一些,难道这是release模式下double的精度一debug有差异吗,还是其他原因引起的??
使用道具 举报 回复
发表于 2013-11-26 13:47:38

回帖奖励 +1 CUDA币

楼主您好:
结果有差异很正常。

以及,您不能说release的结果就不一定精确。因为在release下,将尽量优化代码生成,尽量多的FMA,因此有差异也很有可能代表了更为精确的结果(比CPU更精确的,如果CPU是生成SSE之类指令的话)。

因为您不必担心。(这可能是好事的)

感谢来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 13:58:32
感谢您的回答,我可以采用什么方法可以使release与debug得到相同的结果,我的意思是相同的精度。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 14:04:11
yuhuilcm 发表于 2013-11-26 13:58
感谢您的回答,我可以采用什么方法可以使release与debug得到相同的结果,我的意思是相同的精度。 ...

这个我不知道。

debug下只是为了调试清晰而优化的,您让它能和release一样的精度,可能超出了它的设计目标。

(建议您无视debug下的精度问题,它只是为了调试而优化的,而不能保证其他任何东西)

感谢来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 14:43:10
分别是在不同的电脑上,一台用cpu计算结果,一台用cuda计算,我的CUDA计算的debug 的结果 与cpu的release有相同的计算结果,但是cuda的release与cpu的release计算结果又差异,感觉好迷茫。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 14:58:50
yuhuilcm 发表于 2013-11-26 14:43
分别是在不同的电脑上,一台用cpu计算结果,一台用cuda计算,我的CUDA计算的debug 的结果 与cpu的release有 ...

这个正常,
楼主您要排除“CPU一定是最精确”的错误认识。

很多CPU没有FMA能力的,将带来较大的误差。
而CUDA kernel,往往在release下,编译器可以优化出很多FMA指令,从而提高了精度。

所以希望您不再迷茫,相信GPU, 相信CUDA.(理由如上)

感谢您的莅临。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 15:01:40
玫瑰幻想 发表于 2013-11-26 14:58
这个正常,
楼主您要排除“CPU一定是最精确”的错误认识。

不过您如果真的需要“看上去一样”,而不需要“更接近事实的精确”,

则楼主您可以使用如下2函数代替普通的+和*操作:

c = __fadd_rn(a,b) //替换您的c = a + b
以及:
c = __fmul_rn(a,b) //替换您的c = a * b

使用此2函数可以拒绝编译器为您综合出FMA指令,
有效的为您降低精度,从而满足您的要求。

感谢您的来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-26 15:35:37
谢谢您的回答  
使用道具 举报 回复 支持 反对
发表于 2013-11-26 15:36:16
yuhuilcm 发表于 2013-11-26 15:35
谢谢您的回答

您客气了,服务您是我们的荣幸。

感谢您的莅临。
使用道具 举报 回复 支持 反对
发表于 2013-11-27 14:30:03
请问一下版主,__fadd_rn 以及__cos __sin 这些函数是定义在哪个头文件中的,我老是报错找不到定义
使用道具 举报 回复 支持 反对
12下一页
发新帖
您需要登录后才可以回帖 登录 | 立即注册