Отладка ядер CUDA, вызываемых из кода .NET в VS2008, режим эмуляции - PullRequest
0 голосов
/ 10 октября 2009

CUDA имеет возможность компилировать код в режиме эмуляции, который поддерживается в предоставляемом ими файле .rules.

У меня есть код C # .NET 3.5 SP1, который вызывает собственную dll, используя DllImport, Собственная dll скомпилирована через VS2008 с использованием nvcc, и ее функция состоит в том, чтобы передавать память из CUDA и в нее и вызывать ядра CUDA.

Когда ядра CUDA правильные, все работает нормально, но когда есть ошибка, я могу только перейти к коду до названия ядер и посмотреть параметры, которые они получают. (Я включил отладку собственного кода в опциях отладки проекта запуска.)

Я попытался скомпилировать в режиме эмуляции, однако я получаю ошибку CUDA «смешанное выполнение устройства» при вызове хоста CUDA memcopy -> device. Я попытался переключить alloc + dealloc + memcopy с их эквивалентными версиями не-CUDA, но затем возникает та же ошибка при вызове ядер.

Что я сделал не так, пытаясь использовать режим эмуляции отладки?

P.S. Я попробовал это на Vista x64 SP1 + VS2008, с тем же решением, что и на x86, и на x64, ни один не работал в режиме эмуляции, оба работали в режиме без эмуляции.

Ответы [ 2 ]

1 голос
/ 16 октября 2009

Из Руководства по программированию CUDA стр. 44:

При компиляции приложения в этом режиме (с использованием опции -deviceemu) код устройства скомпилирован и работает на хосте, что позволяет программисту использовать нативный хост поддержка отладки для отладки приложения, как если бы оно было хост-приложением. макрос препроцессора DEVICE_EMULATION определяется в этом режиме. Весь код для приложения, включая любые используемые библиотеки, должны быть скомпилированы последовательно либо для эмуляции устройства или для выполнения устройства. Связывание кода, скомпилированного для устройства эмуляция с кодом, скомпилированным для выполнения устройства, вызывает следующее время выполнения ошибка, которая должна быть возвращена при инициализации: cudaErrorMixedDeviceExecution.

У вас есть только одна DLL, которую вы перекомпилировали для EMU, или есть другие библиотеки DLL, которые не являются, например, утилитой CUDA?

Это работает, как и следовало ожидать на 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
0 голосов
/ 29 мая 2010

Проблема была вызвана отсутствующим событием сборки для копирования DLLS эмуляции SDK (были скопированы только библиотеки TOOLKIT DLL) и несколькими обычными библиотеками вместо библиотек эмуляции.

...