Emulator GPU do programowania CUDA bez sprzętu [zamknięty]

111

Pytanie: Czy istnieje emulator karty Geforce, który pozwoliłby mi programować i testować CUDA bez posiadania właściwego sprzętu?


Informacje:

Chcę przyspieszyć kilka moich symulacji w CUDA, ale moim problemem jest to, że nie zawsze jestem w pobliżu mojego pulpitu, aby robić ten program. Chciałbym zamiast tego popracować na moim netbooku, ale mój netbook nie ma GPU. O ile wiem, do uruchomienia CUDA potrzebny jest procesor graficzny obsługujący CUDA. Czy można to obejść? Wydawałoby się, że jedynym sposobem jest emulator GPU (który oczywiście byłby boleśnie powolny, ale działałby). Ale niezależnie od sposobu, w jaki można to zrobić, chciałbym usłyszeć.

Programuję na Ubuntu 10.04 LTS.

Narkolapser
źródło
Związane z: z procesorem graficznym AMD: stackoverflow.com/questions/12828268/… , na zintegrowanej
karcie

Odpowiedzi:

39

Dla tych, którzy szukają odpowiedzi w 2016 roku (a nawet w 2017 roku) ...


Zrzeczenie się

  • W końcu nie udało mi się emulować GPU.
  • Może być możliwe użycie, gpuocelotjeśli spełniasz listę jego zależności.

Próbowałem zdobyć emulator dla BunsenLabs (Linux 3.16.0-4-686-pae # 1 SMP Debian 3.16.7-ckt20-1 + deb8u4 (2016-02-29) i686 GNU / Linux).

Powiem ci, czego się nauczyłem.


  1. nvccmiał -deviceemuopcję w CUDA Toolkit 3.0

    Pobrałem CUDA Toolkit 3.0, zainstalowałem go i próbowałem uruchomić prosty program:

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

    Zauważ, że w CUDA Toolkit 3.0 nvccbył w /usr/local/cuda/bin/.

    Okazało się, że miałem trudności ze skompilowaniem:

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

    Znalazłem w internecie, że gdybym użył gcc-4.2lub podobnie starożytny zamiast gcc-4.9.2błędów może zniknąć. Poddałem się.


  2. gpuocelot

    Odpowiedź Stringera zawiera link do bardzo starej gpuocelotwitryny projektu. Więc na początku myślałem, że projekt został porzucony w 2012 roku. W rzeczywistości został opuszczony kilka lat później.

    Oto kilka aktualnych witryn internetowych:

    Próbowałem zainstalować gpuocelot postępując zgodnie z instrukcją . Miałem jednak kilka błędów podczas instalacji i ponownie się poddałem. gpuocelotnie jest już obsługiwany i zależy od zestawu bardzo konkretnych wersji bibliotek i oprogramowania.

    Możesz spróbować skorzystać z tego samouczka od lipca 2015 r., Ale nie gwarantuję, że zadziała. Nie testowałem tego.


  3. MCUDA

    Framework MCUDA jest narzędziem opartym na systemie Linux, zaprojektowanym do efektywnej kompilacji modelu programowania CUDA do architektury procesora.

    Może się przydać. Oto link do strony internetowej .


  4. Odpady CUDA

    Jest to emulator do użytku w Windows 7 i 8. Jednak nie próbowałem tego. Wygląda na to, że nie jest już rozwijany (ostatnie zatwierdzenie pochodzi z 4 lipca 2013 r.).

    Oto link do strony projektu: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Ostatnia aktualizacja: 12.03.2017

    Jak dashy zauważył w komentarzach, CU2CL wydaje się być interesującym projektem. Wygląda na to, że jest w stanie przetłumaczyć kod CUDA na kod OpenCL. Jeśli więc Twój procesor graficzny jest w stanie uruchomić kod OpenCL, projekt CU2CL może Cię zainteresować.

    Spinki do mankietów:

Mateusz Piotrowski
źródło
4
To wstyd! Nie zapewniając wolnej ścieżki, bardzo trudno jest tworzyć i testować aplikacje na dowolnej maszynie. Oznacza to, że programiści powinni unikać dodawania zależności do Cuda. Nadal jest używany przez hobbystów i badaczy do jednorazowych projektów. Nie do prawdziwych zastosowań dla klientów.
dashesy
3
CU2CL wydaje się być aktywny i warto się temu przyjrzeć.
dashesy
1
1. nvcc -deviceemu
Nathan,
2
4. zaczął CUDA Wastedziałać
Nathan
2
5. zaczął CU2CLdziałać
Nathan
41

Ta odpowiedź może być za późno, ale i tak warto to zauważyć. GPU Ocelot ( którego jestem jednym z głównych współautorów ) można skompilować bez zainstalowanych sterowników urządzeń CUDA (libcuda.so), jeśli chcesz używać zaplecza Emulatora lub LLVM. Pokazałem emulator na systemach bez GPU NVIDIA.

Emulator stara się wiernie zaimplementować specyfikacje PTX 1.4 i PTX 2.1, które mogą zawierać funkcje, których nie obsługują starsze GPU. Translator LLVM dąży do poprawnego i wydajnego tłumaczenia z PTX na x86, co, miejmy nadzieję, uczyni CUDA skutecznym sposobem programowania wielordzeniowych procesorów, a także GPU.-deviceemujest przestarzałą funkcją CUDA od dłuższego czasu, ale tłumacz LLVM zawsze był szybszy.

Ponadto w emulator wbudowano kilka narzędzi do sprawdzania poprawności w celu weryfikacji: wyrównane dostępy do pamięci, dostęp do pamięci współdzielonej są odpowiednio zsynchronizowane, a dostępy do wyłuskiwania globalnej pamięci przydzielone obszary pamięci. Wdrożyliśmy również interaktywny debugger z linii poleceń, inspirowany głównie przez gdb, do jednoetapowego przechodzenia przez jądra CUDA, ustawiania punktów przerwania i obserwowania itp. Narzędzia te zostały specjalnie opracowane, aby przyspieszyć debugowanie programów CUDA; może ci się przydać.

Przepraszamy za aspekt związany tylko z Linuksem. Uruchomiliśmy gałąź Windows ( a także port Mac OS X ), ale obciążenie inżynieryjne jest już wystarczająco duże, aby podkreślić nasze poszukiwania. Jeśli ktoś ma czas i zainteresowanie, może chcieć pomóc nam w zapewnieniu wsparcia dla systemu Windows!

Mam nadzieję że to pomoże.

kerrmudgeon
źródło
3
Cześć - czy nadal jesteś w pobliżu? Czy istnieje dokumentacja dotycząca tworzenia programu za pomocą Ocelota w istniejącym środowisku kompilacji CUDA? Czy Ocelot współpracuje z Thrust?
Kerrek SB,
Nowszy kod źródłowy GPU Ocelot można znaleźć w GitHub gtcasl / gpuocelot .
l
36

Możesz też sprawdzić gpuocelot projekt , który jest prawdziwym emulatorem w tym sensie, że będzie emulowany PTX (kod bajtowy, na który konwertowany jest kod CUDA).

Jest też tłumacz LLVM, byłoby interesujące przetestować, czy jest szybszy niż przy użyciu -deviceemu.

Podłużnica
źródło
Smutne jest to, że dotyczy to tylko Linuksa. Co, chociaż domyślnie jestem użytkownikiem Linuksa. niewielka część rozwoju, którą wykonuję, dotyczy komputerów z systemem Windows. -Deviceemu jest przestarzałe, więc odpowiedź z jskaggz nie do końca pasuje. w sumie wydaje się, że jest to najlepsza odpowiedź.
Narcolapser
14

Zestaw narzędzi CUDA miał jeden wbudowany do czasu wydania CUDA 3.0. Jeśli używasz jednej z tych bardzo starych wersji CUDA, upewnij się, że używasz -deviceemu podczas kompilacji z nvcc.

Jubal
źródło
4
Emulator CUDA jest przestarzały, prawdopodobnie lepiej przyjrzeć się gpuocelot.
Tom
1
Dodatkowo emulator CUDA używa jednego natywnego wątku systemu operacyjnego na logiczny wątek CUDA, co jest strasznie nieefektywne.
Stringer
9

https://github.com/hughperkins/cuda-on-cl umożliwia uruchamianie programów NVIDIA® CUDA ™ na procesorach graficznych OpenCL 1.2 (pełne ujawnienie: jestem autorem)

Hugh Perkins
źródło
Czy mogę go również uruchomić na procesorze?
Mateusz Piotrowski
Tylko GPU. Wymaga GPU OpenCL 1.2 lub lepszej.
Hugh Perkins
1
Prawdopodobnie możesz uruchomić go na procesorze, używając jrprice.com/Oclgrind , ale myślę, że prawdopodobnie nie o to Ci chodziło ;-). Wydaje mi się, że Coriander (nowa nazwa) prawdopodobnie może również działać na CPU OpenCL, ale nigdy tego nie testowałem. Może wymagać trochę poparcia.
Hugh Perkins
3

Zachowaj ostrożność podczas programowania przy użyciu -deviceemu, ponieważ są operacje, które nvcc zaakceptuje w trybie emulacji, ale nie podczas rzeczywistego działania na GPU. Dzieje się tak głównie podczas interakcji urządzenie-host.

Jak wspomniałeś, przygotuj się na powolną egzekucję.

Sean
źródło
0

GPGPU-Sim to symulator GPU, który może uruchamiać programy CUDA bez użycia GPU. Stworzyłem obraz dockera z zainstalowanym GPGPU-Simem na wypadek, gdyby było to pomocne.

sriraj
źródło