Question: Existe-t-il un émulateur pour une carte Geforce qui me permettrait de programmer et de tester CUDA sans avoir le matériel réel?
Info:
Je cherche à accélérer quelques simulations dans CUDA, mais mon problème est que je ne suis pas toujours sur mon bureau pour faire ce développement. Je voudrais plutôt travailler sur mon netbook, mais mon netbook ne dispose pas de GPU. Pour autant que je sache, vous avez besoin d’un GPU compatible CUDA pour exécuter CUDA. Y a-t-il un moyen de contourner ceci? Il semblerait que la seule solution soit un émulateur GPU (qui serait évidemment très lent, mais fonctionnerait). Mais quel que soit le moyen de le faire, j’aimerais entendre.
Je programme sur Ubuntu 10.04 LTS.
gpuocelot
si vous remplissez sa liste de dépendances. J’ai essayé d’obtenir un émulateur pour BunsenLabs (Linux 3.16.0-4-686-pae # 1 SMP Debian 3.16.7-ckt20-1 + deb8u4 (2016-02-29) i686 GNU / Linux).
Je vais vous dire ce que j’ai appris.
nvcc
habitude d’avoir une option -deviceemu
dans CUDA Toolkit 3.0 J’ai téléchargé CUDA Toolkit 3.0, je l’ai installé et j’ai essayé de lancer un programme simple:
#include __global__ void helloWorld() { printf("Hello world! I am %d (Warp %d) from %d.\n", threadIdx.x, threadIdx.x / warpSize, blockIdx.x); } int main() { int blocks, threads; scanf("%d%d", &blocks, &threads); helloWorld<<>>(); cudaDeviceSynchronize(); return 0; }
Notez que dans CUDA Toolkit 3.0, nvcc
trouvait dans /usr/local/cuda/bin/
.
Il s’est avéré que j’avais des difficultés à le comstackr:
NOTE: device emulation mode is deprecated in this release and will be removed in a future release. /usr/include/i386-linux-gnu/bits/byteswap.h(47): error: identifier "__builtin_bswap32" is undefined /usr/include/i386-linux-gnu/bits/byteswap.h(111): error: identifier "__builtin_bswap64" is undefined /home/user/Downloads/helloworld.cu(12): error: identifier "cudaDeviceSynchronize" is undefined 3 errors detected in the compilation of "/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii".
J’ai trouvé sur Internet que si j’utilisais gcc-4.2
ou similaire à la place de gcc-4.9.2
les erreurs pourraient disparaître. J’ai abandonné.
gpuocelot
La réponse de Ssortingnger a un lien vers un très ancien site Web du projet gpuocelot
. Donc, au début, je pensais que le projet avait été abandonné en 2012 ou plus. En fait, il a été abandonné quelques années plus tard.
Voici quelques sites Web à jour:
J’ai essayé d’installer gpuocelot en suivant le guide . J’ai eu plusieurs erreurs lors de l’installation et j’ai encore abandonné. gpuocelot
n’est plus pris en charge et dépend d’un ensemble de versions très spécifiques des bibliothèques et des logiciels.
Vous pourriez essayer de suivre ce tutoriel à partir de juillet 2015, mais je ne vous garantis pas que cela fonctionnera. Je ne l’ai pas testé.
Le framework de traduction MCUDA est un outil basé sur Linux conçu pour comstackr efficacement le modèle de programmation CUDA vers une architecture de CPU.
Cela pourrait être utile. Voici un lien vers le site .
C’est un émulateur à utiliser sous Windows 7 et 8. Je ne l’ai pas encore essayé. Il ne semble plus être développé (le dernier commit est daté du 4 juillet 2013).
Voici le lien vers le site Web du projet: https://code.google.com/archive/p/cuda-waste/
Dernière mise à jour: 12.03.2017
Comme souligné dans les commentaires, CU2CL semble être un projet intéressant. Il semble être capable de traduire le code CUDA en code OpenCL. Donc, si votre GPU est capable d’exécuter du code OpenCL, le projet CU2CL pourrait vous intéresser.
Liens:
Cette réponse est peut-être trop tardive, mais cela vaut la peine de le noter. GPU Ocelot ( dont je suis l’un des principaux consortingbuteurs ) peut être compilé sans les pilotes de périphérique CUDA (libcuda.so) installés si vous souhaitez utiliser les backends Emulator ou LLVM. J’ai démontré l’émulateur sur des systèmes sans GPU NVIDIA.
L’émulateur tente de mettre en œuvre fidèlement les spécifications PTX 1.4 et PTX 2.1, qui peuvent inclure des fonctionnalités que les anciens GPU ne prennent pas en charge. Le traducteur LLVM s’efforce d’obtenir une traduction correcte et efficace de PTX vers x86, ce qui, espérons-le, fera de CUDA un moyen efficace de programmer des processeurs multicœurs ainsi que des GPU. -deviceemu
est une fonctionnalité obsolète de CUDA depuis un certain temps, mais le traducteur LLVM a toujours été plus rapide.
En outre, plusieurs vérificateurs de correction sont intégrés à l’émulateur pour vérifier que: les access mémoire alignés, les access à la mémoire partagée sont correctement synchronisés et que le déréférencement de la mémoire globale accède aux régions de mémoire allouées. Nous avons également implémenté un débogueur interactif en ligne de commande inspiré en grande partie par gdb pour passer à travers les kernelx CUDA, définir des points d’arrêt et des points de surveillance, etc. Ces outils ont été spécifiquement développés pour accélérer le débogage des programmes CUDA; vous pouvez les trouver utiles.
Désolé pour l’aspect Linux uniquement. Nous avons démarré une twig Windows ( ainsi qu’un port Mac OS X ), mais la charge d’ingénierie est déjà suffisamment importante pour mettre l’accent sur nos activités de recherche. Si quelqu’un a du temps et de l’intérêt, il peut souhaiter nous aider à fournir un support pour Windows!
J’espère que cela t’aides.
Vous pouvez également vérifier le projet gpuocelot qui est un véritable émulateur dans le sens où PTX (code octet dans lequel le code CUDA est converti) sera émulé.
Il y a aussi un traducteur LLVM, il serait intéressant de tester si c’est plus rapide qu’avec -deviceemu.
La boîte à outils CUDA en avait une intégrée jusqu’au cycle de publication de CUDA 3.0. Si vous utilisez l’une de ces très anciennes versions de CUDA, veillez à utiliser -deviceemu lors de la compilation avec NVC.
https://github.com/hughperkins/cuda-on-cl vous permet d’exécuter les programmes NVIDIA® CUDA ™ sur les GPU OpenCL 1.2 (divulgation complète: je suis l’auteur)
Soyez prudent lorsque vous programmez en utilisant -deviceemu, car certaines opérations seront acceptées par nvcc en mode émulation mais pas lors de l’exécution sur un GPU. Cela se trouve principalement avec l’interaction appareil-hôte.
Et comme vous l’avez mentionné, préparez-vous à une exécution lente.