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都采用相同的解决方案,在仿真模式下都没有工作,两者都在非仿真模式下工作。
答案 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)和一些常规库而不是仿真库。