0

CUDA 有一个在仿真模式下编译代码的选项,他们提供的 .rules 文件支持该选项。

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

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

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

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

PS我在Vista x64 SP1 + VS2008上试过这个,在x86和x64上都编译了相同的解决方案,既不能在仿真模式下工作,也不能在非仿真模式下工作。

4

2 回答 2

1

来自 CUDA 编程指南 p44:

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

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

这正如我在 Win7 x64 编译 Debug|x86 并启用 EMU 上所期望的那样工作。

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

 "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
于 2009-10-15T22:26:28.763 回答
0

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

于 2010-05-29T13:14:22.683 回答