生成release版出错

想再问一个问题,在VS2010下写好了程序,生成debug版的时候没有出错,但变成release版时再生成,然后运行就出错了,错误为访问某位置cuda_error_enum(但不是数组越界什么的)程序完全一样,输入也一样,生成debug版没问题,但变成release版时再生成就出错了。出错的位置是一个核函数里的一句test=acos(0.21);这一句注释掉就不出错,没注释就出错了(当然test是一个定义了的double变量),而这语句是嵌在一个循环和很多重的判断语句之中的,但如果把test=acos(0.21);换在核函数的其他部分例如核函数的头部就是没有在很多重的判断语句之中,这样也不出错,请问这可能是什么原因呢?是不是因为太多的判断和循环里执行acos()会有问题呢???谢谢

根据您的描述,您的release版本的生成是无问题的,只是运行出错。
请注意说法。

以及,您八成不是double test = acos(0.21);出错的。而您可能是acos(p[…]);这样的形式出错的。

因为前者(acos(0.21))在release下将被编译为常数1.36之类的,而一句直接的定义个double test = 0.36显然不会导致错误的。

所以您最大的可能是kernel中导致了越界,但是debug版下没有展现出来。

建议您启动start cuda debugging (+cuda memory check), 直接定位到出错位置。谢谢。

当然,也不排除您在非kernel的其他部位出错,但这个可能性较大,建议先检查这个,方法如上段。

版主的意思是在kernel中有类似数组访问越界之类的行为吗?还有debug版下没有展现出来是什么意思呢?或者说有什么情况会使在debug版下没有展现出来?
还想请问一下要如何开启start cuda debugging 呢?核函数不是不支持调试吗?我用的是vs2010

LZ您好:

1:是的,建议您检查一下访存越界。

2:debug和release毕竟行为是不一致的。

3:您可以使用nsight for visual studio 来调试kernel。

大致如此,祝您调试顺利~