2012-02-06 58 views
3

我有一个CUDA程序。如果我用-g -G选项编译这个程序,我可以得到正确的输出。如果我没有使用-g -G选项编译它,我并不总是得到正确的输出。我的猜测是,如果没有-g -G选项,编译器会优化程序并导致竞争状态。任何人都可以证实这一点,并且让我知道我应该怎么做才能让程序产生正确的输出,即使我没有使用-g -G选项编译程序。由于使用或不使用选项编译CUDA程序时有什么区别-g -G

操作系统:x86_64的GNU/Linux的 CUDA版本:4.0 设备:200的Geforce,它是连接到机器的GPU之一,我不认为这是一个显示设备。

回答

4

-G启用调试设备代码(通过生成调试符号),并禁用优化为设备代码。 -g是主机编译器的一个选项,它可以为主机代码生成调试符号(并可以禁用主机代码优化)。

这可能指向你的代码中的竞争条件优化时被禁止,但是被淘汰。例如,您可能会错过设备代码中的__syncthreads(),以使代码正确。没有它,编译器可能会移动负载或存储,导致它产生不正确的结果。如果屏障(__syncthreads())没有穿过,这种代码运动是完全有效的优化。当您指定-G时,可能会禁用这些优化,因此竞争条件不会显示。

首先,确保它是失败的GPU代码,而不是CPU代码通过禁用GPU调试(删除-G),但使CPU的调试(离开-g)。

然后,它缩小到发生故障的特定内核(过程用于缩窄下来是节目相关的)。检查此内核并查找可能需要同步的位置(共享内存依赖性是常见情况),但没有它。

如果你不能找到它,但你可以缩小它是得到错误的结果,具体的内核,在这里尝试共享内核代码,如果可以的话,那么其他人可能会帮助你看到的问题。

+3

另一种可能性(不一定专用于CUDA)是未初始化的变量的存在,由于调试与释放代码的不同,它们会采用不同的值。这也会影响程序的行为。 – 2012-02-07 06:33:10

+0

是的,不能相信我没有包括这一点。这是“仅适用于调试版本”错误的最常见原因...... – harrism 2012-02-07 23:51:28