调试从VS2008中的.NET代码调用的CUDA内核,仿真模式

时间:2009-10-10 03:22:28

标签: .net visual-studio debugging cuda emulation

CUDA可以选择在仿真模式下编译代码,它们提供的.rules文件支持。

我有C#.NET 3.5 SP1代码,使用DllImport调用本机dll, 本机dll是使用nvcc通过VS2008编译的,它的功能是从CUDA向CUDA传输内存并调用CUDA内核。

当CUDA内核正确时,一切运行正常,但是当出现错误时,我只能介入代码直到内核的标题并查看它们收到的参数。 (我在启动项目的调试选项中启用了调试本机代码。)

我尝试使用仿真模式进行编译,但是在调用CUDA memcopy主机 - >设备时,我收到了“混合设备执行”的CUDA错误。 我尝试使用等效的非CUDA版本切换alloc + dealloc + memcopy, 但是在调用内核时会发生同样的错误。

在尝试使用调试仿真模式时,我做错了什么?

P.S。我在Vista x64 SP1 + VS2008上试过这个,x86和x64都采用相同的解决方案,在仿真模式下都没有工作,两者都在非仿真模式下工作。

2 个答案:

答案 0 :(得分:1)

来自CUDA编程指南第44页:

在此模式下编译应用程序时(使用-deviceemu选项),设备代码为 在主机上编译并运行,允许程序员使用主机的本机 调试支持以调试应用程序,就像它是主机应用程序一样。该 预处理器宏 DEVICE_EMULATION 在此模式下定义。所有代码 对于应用程序,包括使用的任何库,必须一致地编译 用于设备仿真或用于设备执行。链接为设备编译的代码 使用为设备执行编译的代码进行仿真会导致以下运行时 初始化时返回的错误:cudaErrorMixedDeviceExecution。

您是否只有一个DLL,您已为EMU重新编译,或者是否有其他DLL不是例如CUDA utils库?

这就像我期望Win7 x64编译启用EMU的Debug | x86一样。

以下是我正在使用的编译器和链接器设置:

 "C:\Program Files\CUDA\bin64\nvcc.exe"   -m32 -arch sm_10 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -deviceemu -D_DEVICEEMU   -Xcompiler "/EHsc /W3 /nologo /Od /Zi   /MT  "  -maxrregcount=32  --compile -o "int\x86\Debug\NBody.DomainModel.Native.cu.obj" "c:\Src\NBody\trunk\NBody.DomainModel.Native\NBody.DomainModel.Native.vcproj"

/VERBOSE /OUT:"c:\Src\NBody\trunk\NBody.DomainModel.Native\bin\x86\Debug\NBody.DomainModel.Native.dll" /INCREMENTAL /NOLOGO /LIBPATH:"C:\Program Files\CUDA\lib64\..\lib" /DLL /MANIFEST /MANIFESTFILE:"int\x86\Debug\NBody.DomainModel.Native.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /NODEFAULTLIB:"libcmt" /DEBUG /ASSEMBLYDEBUG /PDB:"c:\Src\NBody\trunk\NBody.DomainModel.Native\bin\x86\Debug\NBody.DomainModel.Native.pdb" /DYNAMICBASE /FIXED:No /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT cudart.lib

答案 1 :(得分:0)

问题是由于缺少构建事件来复制SDK仿真DLLS(仅复制了TOOLKIT DLL)和一些常规库而不是仿真库。