GPU-Emulator für die CUDA-Programmierung ohne Hardware [geschlossen]


111

Frage: Gibt es einen Emulator für eine Geforce-Karte, mit dem ich CUDA ohne die eigentliche Hardware programmieren und testen kann?


Die Info:

Ich möchte einige meiner Simulationen in CUDA beschleunigen, aber mein Problem ist, dass ich für diese Entwicklung nicht immer auf meinem Desktop bin. Ich möchte stattdessen etwas an meinem Netbook arbeiten, aber mein Netbook hat keine GPU. Soweit ich weiß, benötigen Sie eine CUDA-fähige GPU, um CUDA ausführen zu können. Gibt es eine Möglichkeit, dies zu umgehen? Es scheint, als wäre der einzige Weg ein GPU-Emulator (der offensichtlich schmerzhaft langsam wäre, aber funktionieren würde). Aber wie auch immer es geht, ich würde gerne hören.

Ich programmiere auf Ubuntu 10.04 LTS.


Antworten:


39

Für diejenigen, die die Antwort im Jahr 2016 (und sogar 2017) suchen ...


Haftungsausschluss

  • Ich habe die GPU doch nicht emuliert.
  • Es kann möglicherweise verwendet werden, gpuocelotwenn Sie die Liste der Abhängigkeiten erfüllen.

Ich habe versucht, einen Emulator für BunsenLabs zu bekommen (Linux 3.16.0-4-686-pae # 1 SMP Debian 3.16.7-ckt20-1 + deb8u4 (29.02.2016) i686 GNU / Linux).

Ich werde dir sagen, was ich gelernt habe.


  1. nvccFrüher gab es -deviceemuin CUDA Toolkit 3.0 eine Option

    Ich habe CUDA Toolkit 3.0 heruntergeladen, installiert und versucht, ein einfaches Programm auszuführen:

    #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;
    }

    Beachten Sie, dass in CUDA Toolkit 3.0 nvccin der /usr/local/cuda/bin/.

    Es stellte sich heraus, dass ich Schwierigkeiten beim Kompilieren hatte:

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

    Ich habe im Internet festgestellt, dass bei Verwendung gcc-4.2oder ähnlich alten anstelle gcc-4.9.2der Fehler verschwinden könnten. Ich gab auf.


  2. gpuocelot

    Die Antwort von Stringer enthält einen Link zu einer sehr alten gpuocelotProjektwebsite. Also dachte ich zuerst, dass das Projekt 2012 oder so aufgegeben wurde. Eigentlich wurde es einige Jahre später aufgegeben.

    Hier sind einige aktuelle Websites:

    Ich habe versucht, gpuocelot gemäß der Anleitung zu installieren . Ich hatte jedoch einige Fehler während der Installation und gab wieder auf. gpuocelotwird nicht mehr unterstützt und hängt von einer Reihe sehr spezifischer Versionen von Bibliotheken und Software ab.

    Sie könnten versuchen, diesem Tutorial ab Juli 2015 zu folgen , aber ich kann nicht garantieren, dass es funktioniert. Ich habe es nicht getestet.


  3. MCUDA

    Das MCUDA-Übersetzungsframework ist ein Linux-basiertes Tool, mit dem das CUDA-Programmiermodell effektiv in eine CPU-Architektur kompiliert werden kann.

    Es könnte nützlich sein. Hier ist ein Link zur Website .


  4. CUDA-Abfall

    Es ist ein Emulator für Windows 7 und 8. Ich habe es jedoch nicht ausprobiert. Es scheint nicht mehr entwickelt zu sein (das letzte Commit ist am 4. Juli 2013 datiert).

    Hier ist der Link zur Website des Projekts: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Letzte Aktualisierung: 12.03.2017

    Wie Bindestrich in den Kommentaren hervorhob, scheint CU2CL ein interessantes Projekt zu sein. Es scheint in der Lage zu sein, CUDA-Code in OpenCL-Code zu übersetzen . Wenn Ihre GPU OpenCL-Code ausführen kann, ist das CU2CL-Projekt möglicherweise von Interesse.

    Links:


4
Es ist eine Schande! Da kein langsamer Pfad bereitgestellt wird, ist es sehr schwierig, Anwendungen auf nur einem Computer zu erstellen und zu testen. Dies bedeutet, dass Entwickler vermeiden sollten, Cuda abhängig zu machen. Es kann weiterhin von Hobbyisten und Forschern für einmalige Projekte verwendet werden. Nicht für echte Anwendungen für Kunden.
Bindestrich

3
CU2CL scheint aktiv zu sein und ist auch einen Blick wert.
Bindestrich

1
1. nvcc -deviceemu
Nathan

2
4. machte sich an die CUDA WasteArbeit
Nathan

2
5. machte sich an die CU2CLArbeit
Nathan

41

Diese Antwort mag zu spät sein, aber es ist trotzdem erwähnenswert. GPU Ocelot ( von dem ich einer der Hauptverantwortlichen bin ) kann ohne installierte CUDA-Gerätetreiber (libcuda.so) kompiliert werden, wenn Sie das Emulator- oder LLVM-Backend verwenden möchten. Ich habe den Emulator auf Systemen ohne NVIDIA-GPUs demonstriert.

Der Emulator versucht, die PTX 1.4- und PTX 2.1-Spezifikationen, die möglicherweise Funktionen enthalten, die ältere GPUs nicht unterstützen, genau zu implementieren. Der LLVM-Übersetzer strebt eine korrekte und effiziente Übersetzung von PTX nach x86 an, die CUDA hoffentlich zu einer effektiven Methode zur Programmierung von Multicore-CPUs und GPUs macht. -deviceemuist seit geraumer Zeit ein veraltetes Feature von CUDA, aber der LLVM-Übersetzer war immer schneller.

Darüber hinaus sind mehrere Korrektheitsprüfer in den Emulator integriert, um Folgendes zu überprüfen: Ausgerichtete Speicherzugriffe, Zugriffe auf gemeinsam genutzten Speicher werden ordnungsgemäß synchronisiert und globale Speicher-Dereferenzierungszugriffe auf zugewiesene Speicherbereiche. Wir haben auch eine implementiert interaktiven Befehlszeilen-Debugger der weitgehend von GDB inspiriert ist, um CUDA-Kernel in einem Schritt zu durchlaufen, Haltepunkte und Überwachungspunkte festzulegen usw. Diese Tools wurden speziell entwickelt, um das Debuggen von CUDA-Programmen zu beschleunigen. Sie können sie nützlich finden.

Entschuldigung für den Nur-Linux-Aspekt. Wir haben einen Windows-Zweig gestartet ( sowie einen Mac OS X-Port ) eingerichtet, aber der technische Aufwand ist bereits groß genug, um unsere Forschungsaktivitäten zu belasten. Wenn jemand Zeit und Interesse hat, kann er uns helfen, Windows zu unterstützen!

Hoffe das hilft.


3
Hallo - bist du noch da? Gibt es eine Dokumentation darüber, wie man mit Ocelot ein Programm auf einer vorhandenen CUDA-Build-Umgebung erstellt? Funktioniert Ocelot auch mit Thrust?
Kerrek SB

Neuere GPU Ocelot-Quellcodes finden Sie über GitHub gtcasl / gpuocelot .
l

36

Sie können auch gpuocelot überprüfen Projekt , das ein echter Emulator in dem Sinne ist, dass PTX (Bytecode, in den CUDA-Code konvertiert wird) emuliert wird.

Es gibt auch einen LLVM-Übersetzer. Es wäre interessant zu testen, ob es schneller ist als bei Verwendung von -deviceemu.


Der traurige Teil ist, dass nur für Linux ist. Was, während ich standardmäßig ein Linux-Benutzer bin. Ein kleiner Teil meiner Entwicklung betrifft Windows-Maschinen. Das -deviceemu war veraltet, daher passt die Antwort von jskaggz nicht ganz. Insgesamt scheint dies die beste Antwort zu sein.
Narcolapser

14

In das CUDA-Toolkit war bis zum CUDA 3.0-Release-Zyklus eines integriert. Wenn Sie eine dieser sehr alten Versionen von CUDA verwenden, stellen Sie sicher, dass Sie beim Kompilieren mit nvcc -deviceemu verwenden.


4
Der CUDA-Emulator ist veraltet. Sie sollten sich gpuocelot wahrscheinlich besser ansehen.
Tom

1
Außerdem verwendet der CUDA-Emulator einen nativen Betriebssystem-Thread pro logischem CUDA-Thread, was fürchterlich ineffizient ist.
Stringer

9

Mit https://github.com/hughperkins/cuda-on-cl können Sie NVIDIA® CUDA ™ -Programme auf OpenCL 1.2-GPUs ausführen (vollständige Offenlegung: Ich bin der Autor).


Kann ich es auch auf einer CPU ausführen?
Mateusz Piotrowski

Nur GPU. Benötigt OpenCL 1.2 GPU oder besser.
Hugh Perkins

1
Sie können es wahrscheinlich auf der CPU mit jrprice.com/Oclgrind ausführen , aber ich denke, das ist wahrscheinlich nicht das, was Sie gemeint haben ;-). Ich denke, Coriander (der neue Name) kann wahrscheinlich auch auf CPU OpenCL ausgeführt werden, aber ich habe dies nie getestet. Könnte ein bisschen stupsen brauchen.
Hugh Perkins

3

Seien Sie vorsichtig, wenn Sie mit -deviceemu programmieren, da es Vorgänge gibt, die nvcc im Emulationsmodus akzeptiert, jedoch nicht, wenn sie tatsächlich auf einer GPU ausgeführt werden. Dies tritt hauptsächlich bei der Interaktion zwischen Gerät und Host auf.

Und wie Sie bereits erwähnt haben, bereiten Sie sich auf eine langsame Ausführung vor.


0

GPGPU-Sim ist ein GPU-Simulator, der CUDA-Programme ohne Verwendung einer GPU ausführen kann. Ich habe ein Docker-Image mit GPGPU-Sim erstellt, das für mich installiert ist, falls dies hilfreich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.