web-dev-qa-db-fra.com

Emulateur 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 disposer du matériel réel?


Info:

Je souhaite accélérer quelques-unes de mes simulations dans CUDA, mais le problème est que je ne suis pas toujours près de mon bureau pour effectuer ce développement. J'aimerais plutôt travailler sur mon netbook, mais ce dernier ne possède pas de processeur graphique. Pour autant que je sache, vous avez besoin d'un GPU capable de CUDA pour exécuter CUDA. Y a-t-il un moyen de contourner ceci? Il semblerait que la seule solution est un émulateur de GPU (qui serait évidemment extrêmement lent, mais fonctionnerait). Mais quelle que soit la manière de procéder, j'aimerais entendre.

Je programme sur Ubuntu 10.04 LTS.

102
Narcolapser

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


Avertissement

  • J'ai échoué à émuler le GPU après tout.
  • Il serait peut-être 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 avait l'habitude d'avoir un -deviceemu option de retour 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 <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 trouvé sur Internet que si j'utilisais gcc-4.2 ou similaire au lieu de gcc-4.9.2 les erreurs peuvent disparaître. J'ai abandonné.


  2. gpuocelot

    La réponse de Stringer contient un lien vers un très ancien site Web du projet gpuocelot. Alors au début, je pensais que le projet avait été abandonné en 2012 ou à peu près. En fait, il a été abandonné quelques années plus tard.

    Voici quelques sites Web à jour:

    J'ai essayé d'installer gpuocelot après 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 de bibliothèques et de logiciels.

    Vous pouvez essayer de suivre ce tutoriel à 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 sous Linux conçu pour compiler efficacement le modèle de programmation CUDA en une architecture de CPU.

    Cela pourrait être utile. Voici n lien vers le site .


  4. CUDA Déchets

    C'est un émulateur à utiliser sur Windows 7 et 8. Je ne l'ai pas encore essayé. Il ne semble plus être développé (le dernier commit date 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 dashy indiqué 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:

36
Mateusz Piotrowski

Cette réponse est peut-être trop tard, mais il convient de noter quand même. GPU Ocelot ( dont je suis l'un des contributeurs principaux ) peut être compilé sans pilotes de périphérique CUDA (libcuda.so) installé si vous souhaitez utiliser les backends Emulator ou LLVM. J'ai présenté 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 non prises en charge par les GPU anciens. 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é déconseillée 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: les accès de mémoire alignés, les accès de mémoire partagée sont correctement synchronisés et le déréférencement de mémoire globale accède aux régions allouées de la mémoire. Nous avons également implémenté un débogueur interactif en ligne de commande inspiré en grande partie par gdb pour parcourir en une seule étape 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 démarré une branche Windows ( ainsi qu'un port Mac OS X ), mais le fardeau technique est déjà suffisamment important pour que nos recherches soient moins gênantes. 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.

39
kerrmudgeon

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

Il existe également un traducteur LLVM, il serait intéressant de vérifier s'il est plus rapide qu'avec l'option -deviceemu.

36
Stringer

La boîte à outils CUDA avait une intégrée dans celle-ci 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.

14
Jubal

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)

8
Hugh Perkins

Soyez prudent lorsque vous programmez avec -deviceemu car il existe des opérations que nvcc acceptera en mode émulation, mais pas lorsqu’il est exécuté 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.

3
Sean

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

0
sriraj