我正在使用Visual Studio 2012,当我在调试模式下启动程序时,它运行顺利。 但是,当我在发布模式下运行它时,我在我的一个内核上收到错误“请求启动的资源太多”。
我去比较调试和发布之间的编译参数,似乎当我将“生成GPU调试信息”选项更改为“是(-G)”时,问题就消失了。
为什么会这样?如果没有该选项,是否有一些我无法运行该程序的东西?
编译选项:
D:\Dev\CUDA\bin\nvcc.exe -gencode=arch=compute_50,code=\"sm_50,compute_50\" --use-local-env --cl-version 2012 -ccbin "D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64" -ID:\Dev\CUDA\include -ID:\Dev\CUDA\include -G -lineinfo --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -DWIN32 -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -o x64\Release\main.cu.obj "D:\Dev\Projets\CUDA\ProjAdvMetrixCuda6\Discrete choice v2\main.cu"
答案 0 :(得分:1)
为什么会这样?
这可能是由于每个线程问题的寄存器造成的。发行版和调试版之间的代码生成有很大不同,这会影响每个GPU线程使用的寄存器。如果使用太多,内核将无法启动。
您可以通过修改此特定命令行开关来快速确认:
-maxrregcount=0
到其他一些价值。这可以在其中一个Visual Studio项目配置字段中执行。我会从20这样的值开始。如果这导致发布项目运行,那么每个线程问题都有一个寄存器。您可以通过研究已经讨论过的一些答案来获得更多相关信息,例如答案here
请注意,此问题不一定与发布与调试相关。影响代码生成的任何可能会导致类似的问题,例如32位/ 64位,或其他项目或编译器设置差异。解决方案路径是相同的。