在实现一个算法的过程中,由于涉及到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