Emulation GPU pour la programmation CUDA sans le matériel

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.

Pour ceux qui cherchent la réponse en 2016 (et même en 2017) …


Avertissement

  • Je n’ai pas réussi à émuler le GPU après tout.
  • Il est possible d’utiliser 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.


  1. 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é.


  2. 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:

    • GitHub ;
    • Site web du projet ;
    • Guide d’installation

    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é.


  3. MCUDA

    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 .


  4. CUDA Déchets

    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/


  1. CU2CL

    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:

    • Page d’accueil de CU2CL
    • Dépôt CU2CL GitHub

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.