Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VS2008仿真模式下调试从.NET代码调用的CUDA内核_.net_Visual Studio_Debugging_Cuda_Emulation - Fatal编程技术网

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

在VS2008仿真模式下调试从.NET代码调用的CUDA内核,.net,visual-studio,debugging,cuda,emulation,.net,Visual Studio,Debugging,Cuda,Emulation,CUDA有一个在仿真模式下编译代码的选项,它们提供的.rules文件支持这种模式 我有C#.NET 3.5 SP1代码,它使用DllImport调用本机dll, 本机dll使用nvcc通过VS2008编译,其功能是将内存从CUDA传输到CUDA,并调用CUDA内核 当CUDA内核正确时,一切都正常运行,但当出现错误时,我只能进入代码,直到找到内核的标题并查看它们收到的参数。 (我在启动项目的调试选项中启用了调试本机代码。) 我尝试过使用仿真模式进行编译,但是在调用CUDA memcopy hos

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

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

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

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

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


另外,我在Vista x64 SP1+VS2008上尝试了这一点,在x86和x64中都采用了相同的解决方案,既不在仿真模式下工作,也不在非仿真模式下工作。

来自CUDA编程指南第44页:

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

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

这与我在启用EMU的Win7 x64编译调试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

问题是由于缺少复制SDK仿真dll的生成事件(仅复制了工具包dll)和一些常规的库而不是仿真库造成的。

我有一个项目,其中充满了C#dll,只有一个本机/CUDA dll。这也是我所拥有的。C#应用程序调用C++/CLI DLL,后者反过来调用一些CUDA代码。您在CUDA构建规则中设置了哪些编译选项?例如,是否禁用了优化?我正在调试模式(无优化)下使用标准CUDA 2.3.rules文件的选项。我唯一的改变是将编译器/链接器路由到x86和x64中的不同的CUDA工具包/SDK文件夹,这样我就可以在这两个文件夹中编译。我的C++ DLL甚至不允许CLI。我添加了编译器和链接器设置。将它们与你的进行比较可能会有所帮助。您还可以查看“调试模块”窗口,查看实际加载了哪些库,因为您似乎已经加载了一个非EMU库。