Émulateur 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 de la mienne dans CUDA, mais mon problème est que je ne suis pas toujours autour de mon bureau pour faire ce développement. Je voudrais faire un peu de travail sur mon netbook à la place, mais mon netbook n'a pas de GPU. Maintenant, pour autant que je sache, vous avez besoin d'un GPU compatible CUDA pour exécuter CUDA. Est-il un moyen de contourner cette? Il semblerait que le seul moyen soit un émulateur GPU (qui serait évidemment douloureusement lent, mais fonctionnerait). Mais quel que soit le moyen de le faire, j'aimerais entendre.
Je programme sur Ubuntu 10.04 LTS.
6 réponses
Pour ceux qui cherchent la réponse en 2016 (et même 2017)...
Avertissement
- j'ai échoué à émuler le GPU après tout.
- Il peut être possible d'utiliser
gpuocelot
Si vous remplissez sa liste de dépendance.
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
utilisé pour avoir une option-deviceemu
dans CUDA Toolkit 3.0J'ai téléchargé CUDA Toolkit 3.0, l'ai installé et essayé d'exécuter un simple programme:
#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 tout aussi ancien au lieu degcc-4.9.2
les erreurs pourraient disparaître. J'ai renoncé.
-
gpuocelot
Le answer by Stringer a un lien vers un très vieux site Web du projet
gpuocelot
. Donc au début, je pensais que le projet a été abandonné en 2012 ou. 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 donné de nouveau.
gpuocelot
n'est plus pris en charge et dépend d'un ensemble de très spécifique versions de bibliothèques et de logiciels.Vous pouvez essayer de suivre ce tutoriel de juillet 2015 mais je ne garantis pas que cela fonctionnera. Je n'ai pas testé.
-
MCUDA
Le framework de traduction MCUDA est un outil basé sur linux conçu pour compiler efficacement le modèle de programmation CUDA à une architecture CPU.
Ça pourrait être utile. Voici un lien vers le site web de.
-
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 du projet: https://code.google.com/archive/p/cuda-waste/
Cette réponse est peut-être trop tardive, mais cela vaut la peine d'être noté de toute façon. GPU Ocelot (dont je suis l'un des principaux contributeurs ) peut être compilé sans pilotes de périphériques CUDA (libcuda.so) installé si vous souhaitez utiliser L'émulateur ou les backends LLVM. J'ai démontré l'émulateur sur les 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 GPU plus anciens ne supportent pas. 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. -deviceemu
est une fonctionnalité obsolète de CUDA depuis un certain temps, mais le traducteur LLVM a toujours été plus rapide.
De plus, Plusieurs correcteurs d'exactitude sont intégrés dans l'émulateur pour vérifier: les accès à la mémoire alignée, les accès à la mémoire partagée sont correctement synchronisés et les accès au déréférencement de la mémoire globale des 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 une seule étape à travers les noyaux CUDA, définir des points d'arrêt et des points de veille, 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 lancé une branche Windows ( ainsi qu'un port Mac OS X ) mais le fardeau de l'ingénierie est déjà assez important pour souligner nos activités de recherche. Si n'importe qui a du temps et de l'intérêt, ils peuvent nous aider à fournir un support pour Windows!
J'espère que cela aide.
- [1]: GPU Ocelot - https://code.google.com/archive/p/gpuocelot/
- [2]: débogueur interactif Ocelot - http://forums.nvidia.com/index.php?showtopic=174820
Vous pouvez également vérifier gpuocelot projet 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.
La boîte à outils CUDA avait un intégré jusqu'au cycle de version Cuda 3.0. Je vous utilise une de ces très anciennes versions de CUDA, assurez-vous d'utiliser-deviceemu lors de la compilation avec nvcc.
Https://github.com/hughperkins/cuda-on-cl vous permet D'exécuter des 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 il y a des opérations que nvcc acceptera en mode d'émulation mais pas en cours d'exécution sur un GPU. Ceci est principalement trouvé avec l'interaction périphérique-hôte.
Et comme vous l'avez mentionné, préparez - vous à une exécution lente.