使用或不使用选项 -g -G 编译 CUDA 程序有什么区别

问题描述 投票:0回答:1

我有一个 CUDA 程序。如果我使用 -g -G 选项编译该程序,我可以获得正确的输出。如果我在没有 -g -G 选项的情况下编译它,我并不总是得到正确的输出。我的猜测是,如果没有 -g -G 选项,编译器将优化程序并导致竞争条件。任何人都可以确认这一点,并且让我知道即使我在没有 -g -G 选项的情况下编译程序,我应该做什么才能让程序产生正确的输出。谢谢

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

cuda
1个回答
4
投票

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

这可能表明代码中存在竞争条件,当优化被禁用时,该竞争条件就会被消除。 例如,您的设备代码中可能缺少

__syncthreads()
,而这将使代码正确。 如果没有它,编译器可能会移动负载或存储,从而导致生成不正确的结果。 如果不跨越障碍 (
__syncthreads()
),这样的代码移动是完全有效的优化。 当您指定 -G 时,此类优化可能会被禁用,因此竞争条件不会显现出来。

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

然后,将范围缩小到出现故障的特定内核(缩小范围的过程取决于程序)。 检查此内核并查找可能需要同步的地方(共享内存依赖是常见情况)但没有同步。

如果找不到它,但您可以将范围缩小到得到错误结果的特定内核,如果可以的话,尝试在此处共享内核代码,以便其他人可以帮助您解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.