2009-10-10 7 views
0

CUDA dispose d'une option pour compiler le code en mode d'émulation, qui est supporté dans le fichier .rules qu'ils fournissent.Débogage des noyaux CUDA appelés du code .NET dans VS2008, mode d'émulation

J'ai code C# .NET 3.5 SP1 qui appelle une DLL native, en utilisant DllImport, le dll natif compilé à partir VS2008 à l'aide nvcc et sa fonction est de transférer la mémoire de et vers CUDA et pour appeler les noyaux CUDA. Quand les noyaux CUDA sont corrects, tout fonctionne bien, mais quand il y a un bogue, je peux seulement entrer dans le code jusqu'au titre des noyaux et voir les paramètres qu'ils reçoivent. (j'ai activé le débogage du code natif dans les options de débogage de démarrage-projet.)

J'ai essayé de compiler avec le mode d'émulation, mais je reçois l'erreur CUDA « d'exécution du dispositif mixte » lorsque vous appelez l'hôte memcopy CUDA -> appareil. J'ai essayé de commuter alloc + dealloc + memcopy avec leurs versions équivalentes non-CUDA, mais la même erreur se produit lors de l'invocation des noyaux.

Qu'est-ce que j'ai fait de mal dans ma tentative d'utiliser le mode d'émulation de débogage?

P.S. J'ai essayé cela sur Vista x64 SP1 + VS2008, avec la même solution à la fois dans x86 et x64, ni travaillé en mode d'émulation, les deux travaillé en mode non-émulation.

Répondre

0

La question a été provoquée par un événement de construction manquant pour copier les DLL d'émulation de SDK (uniquement les DLL TROUSSE ont été copiés) et quelques réguliers libs à la place des bibliothèques d'émulation.

1

du guide de programmation CUDA P44:

Lors de la compilation d'une application dans ce mode (en utilisant l'option -deviceemu), le code de l'appareil est compilé et fonctionne sur l'hôte, ce qui permet de le programmeur d'utiliser l'hôte natif support de débogage pour déboguer l'application comme s'il s'agissait d'une application hôte. La macro de préprocesseur DEVICE_EMULATION est définie dans ce mode. Tout le code pour une application, y compris les bibliothèques utilisées, doit être compilé de manière cohérente soit pour l'émulation du périphérique ou pour l'exécution du périphérique. Le code de liaison compilé pour le périphérique l'émulation avec le code compilé pour l'exécution de périphérique provoque l'erreur d'exécution suivante à renvoyer lors de l'initialisation: cudaErrorMixedDeviceExecution.

Avez-vous juste une seule DLL que vous avez recompilée pour EMU ou existe-t-il d'autres DLL qui ne sont pas par exemple la bibliothèque d'utilitaires CUDA?

Cela fonctionne comme je l'attendrais sur Win7 x64 de compilation Debug | x86 avec EMU activé.

Voici le compilateur et les paramètres éditeur de liens que je utilise:

"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

J'ai un projet plein de dll C# avec une seule DLL native/CUDA. –

+0

C'est ce que j'ai aussi. Application C# appelant dans une DLL C++/CLI qui à son tour appelle du code CUDA. Quelles options de compilation avez-vous définies dans les règles de construction CUDA? Par exemple, l'optimisation est-elle désactivée? –

+0

J'utilise les options du fichier CUDA 2.3 .rules standard, en mode débogage (pas d'optimisation). Le seul changement que j'ai fait a été le routage du compilateur/éditeur de liens vers différents dossiers CUDA Toolkit/SDK en x86 et en x64 afin que je puisse compiler dans les deux. –

Questions connexes