Émulateur GPU pour la programmation CUDA sans le matériel [fermé]

111

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 certaines de mes 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 n'a 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 le seul moyen soit un émulateur GPU (qui serait évidemment extrêmement lent, mais fonctionnerait). Mais quelle que soit la manière de procéder, j'aimerais l'entendre.

Je programme sur Ubuntu 10.04 LTS.

Narcolapser
la source
En relation: avec le GPU AMD: stackoverflow.com/questions/12828268/… , sur les graphiques intégrés Intel: stackoverflow.com/questions/8193242/can-i-run-cuda-on-intel
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

39

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


Avertissement

  • Je n'ai pas réussi à émuler le GPU après tout.
  • Il pourrait être possible d'utiliser gpuocelotsi vous satisfaites 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. nvccutilisé pour avoir une -deviceemuoption dans CUDA Toolkit 3.0

    J'ai téléchargé CUDA Toolkit 3.0, je l'ai installé et j'ai essayé d'exécuter un programme simple:

    #include <stdio.h>
    
    __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<<<blocks, threads>>>();
        cudaDeviceSynchronize();
        return 0;
    }

    Notez que dans CUDA Toolkit 3.0 nvccétait dans le /usr/local/cuda/bin/.

    Il s'est avéré que j'avais des difficultés à le compiler:

    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 découvert sur Internet que si j'utilisais gcc-4.2ou de manière similaire, gcc-4.9.2les erreurs pourraient disparaître. J'ai abandonné.


  2. gpuocelot

    La réponse de Stringer a un lien vers un gpuocelotsite Web de projet très ancien . Au début, j'ai donc pensé que le projet avait été abandonné en 2012 environ. 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 de nouveau abandonné. gpuocelotn'est plus pris en charge et dépend d'un ensemble de versions très spécifiques de bibliothèques et de logiciels.

    Vous pouvez essayer de suivre ce didacticiel à partir de juillet 2015, mais je ne 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 compiler efficacement le modèle de programmation CUDA dans une architecture CPU.

    Cela pourrait être utile. Voici un lien vers le site Web .


  4. Déchets CUDA

    C'est un émulateur à utiliser sur Windows 7 et 8. Je ne l'ai pas essayé cependant. 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 Dashesy l'a 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:

Mateusz Piotrowski
la source
4
C'est dommage! En ne fournissant pas un chemin lent, il est très difficile de créer et de tester des applications sur n'importe quelle machine. Cela signifie que les développeurs doivent éviter d'ajouter une dépendance à Cuda. Il est toujours utilisable par les amateurs et les chercheurs, pour des projets ponctuels. Pas pour de vraies applications pour les clients.
dashesy
3
CU2CL semble être actif et mérite également d'être examiné.
dashesy
1
1. nvcc -deviceemu
Nathan
2
4. a CUDA Wastetravaillé
Nathan
2
5. a CU2CLtravaillé
Nathan
41

Cette réponse est peut-être trop tardive, mais cela vaut la peine de le noter quand même. GPU Ocelot ( dont je suis l'un des principaux contributeurs ) peut être compilé sans les pilotes de périphériques 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 d'implémenter 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 qui, espérons-le, fera de CUDA un moyen efficace de programmer des processeurs multicœurs ainsi que des GPU. -deviceemuest une fonctionnalité obsolète de CUDA depuis un certain temps, mais le traducteur LLVM a toujours été plus rapide.

En outre, plusieurs vérificateurs d'exactitude sont intégrés à l'émulateur pour vérifier: les accès mémoire alignés, les accès à la mémoire partagée sont correctement synchronisés et 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 largement inspiré de gdb pour passer en une seule étape à travers les noyaux CUDA, définir des points d'arrêt et des points de surveillance, etc ... Ces outils ont été spécialement 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 lancé une branche Windows ( ainsi qu'un port Mac OS X ), mais la charge d'ingénierie est déjà suffisamment importante pour stresser nos recherches. Si quelqu'un a du temps et de l'intérêt, il peut souhaiter nous aider à fournir une assistance pour Windows!

J'espère que cela t'aides.

kerrmudgeon
la source
3
Salut - tu es toujours là? Existe-t-il une documentation sur la façon dont on construit un programme avec Ocelot sur un environnement de construction CUDA existant? De plus, Ocelot fonctionne-t-il avec Thrust?
Kerrek SB
Le code source GPU Ocelot plus récent peut être trouvé via GitHub gtcasl / gpuocelot .
l --marc l
36

Vous pouvez également vérifier le projet gpuocelot qui est un véritable émulateur dans le sens où PTX (bytecode dans lequel le code CUDA est converti) sera émulé.

Il y a aussi un traducteur LLVM, il serait intéressant de tester s'il est plus rapide que lors de l'utilisation de -deviceemu.

Raidisseur
la source
Le plus triste est que ce n'est que pour Linux. Lequel, alors que je suis un utilisateur Linux par défaut. une petite partie du développement que je fais est sur des machines Windows. -Deviceemu était obsolète, donc la réponse jskaggz ne correspond pas tout à fait. dans l'ensemble, cela semble être la meilleure réponse.
Narcolapser
14

La boîte à outils CUDA en avait une intégrée jusqu'au cycle de publication de CUDA 3.0. Si vous utilisez une de ces très anciennes versions de CUDA, assurez-vous d'utiliser -deviceemu lors de la compilation avec nvcc.

Jubal
la source
4
L'émulateur CUDA est obsolète, il vaut probablement mieux regarder gpuocelot.
Tom
1
De plus, l'émulateur CUDA utilise un thread OS natif par thread CUDA logique, ce qui est terriblement inefficace.
Stringer
9

https://github.com/hughperkins/cuda-on-cl vous permet d'exécuter des programmes NVIDIA® CUDA ™ sur des GPU OpenCL 1.2 (divulgation complète: je suis l'auteur)

Hugh Perkins
la source
Puis-je l'exécuter également sur un processeur?
Mateusz Piotrowski
GPU uniquement. Nécessite un GPU OpenCL 1.2 ou supérieur.
Hugh Perkins
1
Vous pouvez probablement l'exécuter sur le processeur, en utilisant jrprice.com/Oclgrind , mais je suppose que ce n'est probablement pas ce que vous vouliez dire ;-). Je suppose que Coriander (le nouveau nom) peut probablement aussi fonctionner sur CPU OpenCL, mais je n'ai jamais testé cela. Peut-être besoin d'un peu de pression.
Hugh Perkins
3

Soyez prudent lorsque vous programmez en utilisant -deviceemu car il y a des opérations que nvcc acceptera en mode d'é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.

Sean
la source
0

GPGPU-Sim est un simulateur de GPU qui peut exécuter des programmes CUDA sans utiliser de GPU. J'ai créé une image docker avec GPGPU-Sim installé pour moi-même au cas où cela serait utile.

sriraj
la source