release模式和debug下 得到的结果有差异

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

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

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

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

感谢来访。

感谢您的回答,我可以采用什么方法可以使release与debug得到相同的结果,我的意思是相同的精度。

这个我不知道。

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

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

感谢来访。

分别是在不同的电脑上,一台用cpu计算结果,一台用cuda计算,我的CUDA计算的debug 的结果 与cpu的release有相同的计算结果,但是cuda的release与cpu的release计算结果又差异,感觉好迷茫。

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

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

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

感谢您的莅临。

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

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

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

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

感谢您的来访。

谢谢您的回答

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

感谢您的莅临。

请问一下版主,__fadd_rn 以及__cos __sin 这些函数是定义在哪个头文件中的,我老是报错找不到定义

[

LZ您好:

这些函数在device_functions.h中声明,但是您一般只需要#include“cuda_runtime.h”,即可以直接在kernel中使用这些函数。

您可以在CUDA C Programming Guide中的Mathematical Functions章节查看这些函数的相关介绍。

祝您好运~

请问一下,我在VS2010下 cuda编程,debug下的属性中,Generate GPU Debug Infomtion 默认但是Yes(-G),修改成No会得到不同的运行结果,请问版主有遇到过类似的情况吗?

请问一下版主 在VS2010中,在属性项里面CUDA ,debug下将Generate GPU debug Information设置成NO 得到不同的运算结果,请问版主有晕倒过类似问题吗?

您可以在任何一个kernel里使用它们,无需特定的头文件的。
(但楼主请不要在host code里使用他们)

以及,后者(__cos/__sin)我想您应该指的是__cosf和__sinf