【问题标题】:Debuging CUDA kernels called from .NET code in VS2008, emulation mode调试 VS2008 中从 .NET 代码调用的 CUDA 内核,仿真模式
【发布时间】:2010-12-05 12:56:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: .net visual-studio debugging cuda emulation


    【解决方案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
    

    【讨论】:

    • 我有一个充满 C# dll 的项目,只有一个本地/CUDA dll。
    • 我也有。 C# 应用程序调用到 C++/CLI DLL,后者又调用一些 CUDA 代码。您在 CUDA 构建规则中设置了哪些编译选项?例如优化是否被禁用?
    • 我在调试模式下使用标准 CUDA 2.3 .rules 文件的选项(无优化)。我所做的唯一更改是将编译器/链接器路由到 x86 和 x64 中的不同 CUDA Toolkit/SDK 文件夹,以便我可以在两者中进行编译。
    • 我的 C++ DLL 甚至没有启用 CLI。
    • 我添加了我的编译器和链接器设置。将它们与您的进行比较可能会有所帮助。您还可以查看调试模块窗口并查看实际加载了哪些库,因为您似乎以某种方式获得了非 EMU 库。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2011-05-01
      • 2021-08-25
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      相关资源
      最近更新 更多