Wydaje mi się, że w dzisiejszych czasach wiele obliczeń wykonuje się na GPU. Oczywiście grafika jest tam zrobiona, ale przy użyciu CUDA i tym podobnych, AI, algorytmy mieszające (myśl bitcoiny) i inne są również wykonywane na GPU. Dlaczego nie możemy po prostu pozbyć się procesora i samodzielnie korzystać z GPU? Co sprawia, że procesor graficzny jest o wiele szybszy niż procesor?
373
Odpowiedzi:
Odpowiedź TL; DR: Procesory graficzne mają znacznie więcej rdzeni procesorów niż procesory, ale ponieważ każdy rdzeń GPU działa znacznie wolniej niż rdzeń procesora i nie ma funkcji potrzebnych w nowoczesnych systemach operacyjnych, nie są one odpowiednie do wykonywania większości operacji na co dzień przetwarzanie danych. Najbardziej nadają się do intensywnych obliczeń, takich jak przetwarzanie wideo i symulacje fizyki.
GPGPU to wciąż stosunkowo nowa koncepcja. Procesory graficzne były początkowo używane tylko do renderowania grafiki; wraz z postępem technologii wykorzystano dużą liczbę rdzeni w procesorach graficznych w stosunku do procesorów, opracowując możliwości obliczeniowe dla procesorów graficznych, aby mogły przetwarzać wiele równoległych strumieni danych jednocześnie, bez względu na to, jakie to dane. Chociaż procesory graficzne mogą mieć setki, a nawet tysiące procesorów strumieniowych, każdy z nich działa wolniej niż rdzeń procesora i ma mniej funkcji (nawet jeśli są one kompletne i można je zaprogramować do uruchamiania dowolnego programu, który procesor może uruchomić). Funkcje, których brakuje w procesorach GPU, to przerwania i pamięć wirtualna, które są wymagane do wdrożenia nowoczesnego systemu operacyjnego.
Innymi słowy, procesory i procesory graficzne mają znacząco różne architektury, dzięki czemu lepiej nadają się do różnych zadań. Karta graficzna może obsługiwać duże ilości danych w wielu strumieniach, wykonując na nich stosunkowo proste operacje, ale nie nadaje się do intensywnego lub złożonego przetwarzania jednego lub kilku strumieni danych. Procesor jest znacznie szybszy w przeliczeniu na rdzeń (pod względem instrukcji na sekundę) i może łatwiej wykonywać złożone operacje na jednym lub kilku strumieniach danych, ale nie może efektywnie obsługiwać wielu strumieni jednocześnie.
W rezultacie procesory graficzne nie nadają się do obsługi zadań, które nie przynoszą znaczących korzyści lub których nie można zrównoważyć, w tym wielu popularnych aplikacji konsumenckich, takich jak edytory tekstu. Ponadto procesory graficzne wykorzystują zasadniczo inną architekturę; należałoby zaprogramować aplikację specjalnie dla GPU, aby działała, a programowanie układów GPU wymaga znacznie różnych technik. Te różne techniki obejmują nowe języki programowania, modyfikacje istniejących języków i nowe paradygmaty programowania, które lepiej nadają się do wyrażania obliczeń jako operacji równoległej wykonywanej przez wiele procesorów strumieniowych. Więcej informacji na temat technik potrzebnych do programowania procesorów graficznych można znaleźć w artykułach Wikipedii na temat przetwarzania strumieniowego i obliczeń równoległych .
Nowoczesne karty graficzne są w stanie wykonywać operacje wektorowe i arytmetykę zmiennoprzecinkową, a najnowsze karty potrafią manipulować liczbami zmiennoprzecinkowymi podwójnej precyzji. Ramy takie jak CUDA i OpenCL umożliwiają pisanie programów dla układów GPU, a natura układów GPU sprawia, że są one najbardziej odpowiednie do operacji o wysokim stopniu równoległości, na przykład w obliczeniach naukowych, gdzie seria wyspecjalizowanych kart obliczeniowych GPU może być realnym zamiennikiem małej klaster obliczeniowy jak w superkomputerach osobistych NVIDIA Tesla . Konsumenci z nowoczesnymi układami GPU, którzy mają doświadczenie w Folding @ home, mogą z nich korzystać, aby współpracować z klientami GPU , którzy mogą przeprowadzać symulacje składania białek z bardzo dużą prędkością i wnieść więcej pracy do projektu (przeczytaj często zadawane pytania)po pierwsze, szczególnie te związane z procesorami graficznymi). Procesory graficzne mogą także umożliwiać lepszą symulację fizyki w grach wideo za pomocą PhysX, przyspieszać kodowanie i dekodowanie wideo oraz wykonywać inne zadania wymagające dużej mocy obliczeniowej. Do tego typu zadań najbardziej odpowiednie są procesory graficzne.
AMD jest pionierem w projektowaniu procesorów o nazwie Accelerated Processing Unit (APU), która łączy konwencjonalne rdzenie procesorów x86 z procesorami graficznymi. Takie podejście zapewnia wydajność graficzną znacznie przewyższającą rozwiązania graficzne zintegrowane z płytą główną (choć nie dorównuje droższym dyskretnym kartom graficznym) i pozwala na stworzenie kompaktowego, taniego systemu z dobrą wydajnością multimediów bez potrzeby posiadania osobnego procesora graficznego. Najnowsze procesory Intel oferują również zintegrowaną grafikę na układzie, chociaż konkurencyjna wydajność zintegrowanego procesora graficznego jest obecnie ograniczona do kilku układów z układem Intel Iris Pro Graphics. W miarę postępu technologii zauważamy rosnący stopień konwergencji tych niegdyś oddzielnych części. Prognozy AMDprzyszłość, w której procesor i GPU są jednym, zdolnym do płynnej współpracy nad tym samym zadaniem .
Niemniej jednak wiele zadań wykonywanych przez systemy operacyjne i aplikacje na komputery PC są nadal lepiej dostosowane do procesorów i potrzeba dużo pracy, aby przyspieszyć program korzystający z GPU. Ponieważ tak wiele istniejących programów korzysta z architektury x86, a ponieważ procesory graficzne wymagają różnych technik programowania i brakuje kilku ważnych funkcji potrzebnych w systemach operacyjnych, ogólne przejście z procesora na procesor graficzny w codziennych obliczeniach jest bardzo trudne.
źródło
Procesor graficzny nie jest szybszy niż procesor. Procesor i GPU zostały zaprojektowane z dwoma różnymi celami, z różnymi kompromisami, więc mają inną charakterystykę wydajności. Niektóre zadania są szybsze w CPU, podczas gdy inne zadania są szybciej obliczane w GPU. Procesor specjalizuje się w wykonywaniu skomplikowanych manipulacji niewielkim zestawem danych, procesor GPU wyróżnia się w wykonywaniu prostych manipulacji dużym zestawem danych.
GPU to procesor specjalnego przeznaczenia, zaprojektowany tak, aby jedna instrukcja działała na dużym bloku danych (SIMD / Single Instruction Multiple Data), przy czym wszystkie stosują tę samą operację. Praca w blokach danych jest z pewnością bardziej wydajna niż praca z pojedynczą komórką na raz, ponieważ dekodowanie instrukcji jest znacznie zmniejszone, jednak praca w dużych blokach oznacza, że jest więcej równoległych jednostek roboczych, więc wykorzystuje znacznie więcej tranzystorów do wdrożenia pojedynczej instrukcji GPU (powodując fizyczne ograniczenie rozmiaru, zużywając więcej energii i wytwarzając więcej ciepła).
Procesor jest zaprojektowany tak, aby jak najszybciej wykonać pojedynczą instrukcję na jednym układzie odniesienia. Ponieważ musi pracować tylko z jednym układem odniesienia, liczba tranzystorów wymaganych do wdrożenia pojedynczej instrukcji jest znacznie mniejsza, więc procesor może pozwolić sobie na większy zestaw instrukcji, bardziej złożoną ALU, lepsze przewidywanie gałęzi, lepiej zwirtualizowane architektura i bardziej wyrafinowane schematy buforowania / potoku. Jego cykle instrukcji są również szybsze.
Powodem, dla którego nadal używamy procesora, nie jest to, że x86 jest królem architektury procesorów, a system Windows jest napisany dla x86. Powodem, dla którego nadal używamy procesora, jest rodzaj zadań, które musi wykonać system operacyjny, tj. Podejmowanie decyzji, działa wydajniej na architekturze procesora. System operacyjny musi spojrzeć na setki różnych rodzajów danych i podejmować różne decyzje, które zależą od siebie; tego rodzaju zadanie nie jest łatwo równoległe, przynajmniej nie w architekturze SIMD.
W przyszłości zobaczymy konwergencję między CPU a architekturą GPU, ponieważ CPU zyskuje zdolność do pracy nad blokami danych, np. SSE. Ponadto, wraz z poprawą technologii produkcji i zmniejszeniem liczby układów, procesor graficzny może pozwolić sobie na wdrożenie bardziej złożonych instrukcji.
źródło
Brakuje układów GPU:
Potrzebujesz ich do wdrożenia czegoś takiego jak nowoczesny system operacyjny.
Są także (względnie) powolne przy arytmetyki podwójnej precyzji (w porównaniu z wydajnością arytmetyczną pojedynczej precyzji) * i są znacznie większe (pod względem wielkości krzemu). Starsze architektury GPU nie obsługują wywołań pośrednich (za pomocą wskaźników funkcji) potrzebnych do większości programowania ogólnego przeznaczenia, a nowsze architektury, które robią to powoli. Wreszcie (jak zauważyły inne odpowiedzi) w przypadku zadań, których nie można zrównoleglać, procesory graficzne tracą w porównaniu z procesorami obciążonymi tym samym obciążeniem.
EDYCJA : Należy pamiętać, że ta odpowiedź została napisana w 2011 roku - technologia GPU stale się zmienia. Rzeczy mogą się bardzo różnić w zależności od tego, kiedy czytasz: P
* Niektóre procesory graficzne nie są wolne z arytmetyką o podwójnej precyzji, takie jak linie Quadro lub Tesla NVidii (generacja Fermi lub nowsza) lub linia FirePro AMD (generacja GCN lub nowsza). Ale nie są to urządzenia większości konsumentów.
źródło
Procesor jest jak pracownik, który idzie bardzo szybko. Procesor graficzny jest jak grupa klonów, którzy idą szybko, ale wszyscy muszą wspólnie robić dokładnie to samo (z wyjątkiem tego, że niektóre klony mogą pozostawać bezczynne, jeśli chcesz)
Który wolałbyś mieć jako swojego programistę, jednego superszybkiego faceta lub 100 szybkich klonów, które nie są tak szybkie, ale wszystkie muszą wykonywać te same działania jednocześnie?
W przypadku niektórych działań klony są całkiem dobre, np. Zamiatają podłogę - każdy może zamiatać jej część.
W przypadku niektórych działań klony śmierdzą, np. Pisz cotygodniowy raport - wszystkie klony oprócz jednego siedzą bezczynnie, podczas gdy jeden klon pisze raport (w przeciwnym razie dostajesz tylko 100 kopii tego samego raportu).
źródło
Ponieważ układy GPU są zaprojektowane do robienia wielu małych rzeczy na raz, a procesory są zaprojektowane do robienia jednej rzeczy naraz. Jeśli twój proces może być masowo równoległy, jak haszowanie, GPU jest o rząd wielkości szybszy, inaczej nie będzie.
Twój procesor może obliczyć wartość skrótu znacznie, znacznie szybciej niż twój procesor graficzny - ale czas, jaki zajmuje procesor, procesor graficzny może być w trakcie kilkuset skrótów. Procesory graficzne są zaprojektowane do robienia wielu rzeczy jednocześnie, a procesory są zaprojektowane do robienia jednej rzeczy naraz, ale bardzo szybko.
Problem polega na tym, że procesory i układy GPU są bardzo różnymi rozwiązaniami dla bardzo różnych problemów, nakładają się one na siebie, ale ogólnie to, co w ich domenie pozostaje w domenie. Nie możemy zastąpić procesora GPU, ponieważ procesor tam siedzi i wykonuje swoją pracę znacznie lepiej niż kiedykolwiek GPU, po prostu dlatego, że GPU nie jest przeznaczony do wykonywania tego zadania, a procesor jest.
Drobna dodatkowa uwaga, gdyby możliwe było złomowanie procesora i posiadanie tylko GPU, nie sądzisz, że zmienilibyśmy go? :)
źródło
Czy naprawdę pytasz, dlaczego nie korzystamy z procesorów graficznych podobnych do GPU w procesorze?
GPU to po prostu wyspecjalizowany procesor karty graficznej. Pożyczamy obliczenia na grafice innej niż GPU, ponieważ procesory ogólnego przeznaczenia po prostu nie radzą sobie z wykonywaniem równoległym i zmiennoprzecinkowym.
W rzeczywistości używamy różnych (więcej GPU) architektur CPU. Np. Procesory Niagara są dość wielozadaniowe. SPARC T3 uruchomi 512 współbieżnych wątków.
źródło
Mogę się tutaj strasznie mylić i wypowiadam się w tej sprawie z niewielkim lub żadnym autorytetem, ale oto:
Uważam, że każda jednostka wykonawcza GPU („rdzeń”) ma bardzo ograniczoną przestrzeń adresową w porównaniu do procesora.
Jednostki wykonawcze GPU nie mogą skutecznie radzić sobie z rozgałęzianiem.
Jednostki wykonawcze GPU nie obsługują przerwań sprzętowych w taki sam sposób, jak procesory.
Zawsze myślałem, że sposób, w jaki powinny być wykonywane jednostki GPU, przypomina coś w rodzaju „SPE” Playstation 3, chcą otrzymać blok danych, uruchomić na nim szereg operacji sekwencyjnych, a następnie wypluć kolejny blok dane, spłucz, powtórz. Nie mają tyle pamięci adresowalnej, co główna „CPE”, ale chodzi o to, aby każdą „SPE” dedykować do określonego, sekwencyjnego zadania. Dane wyjściowe jednej jednostki mogą zasilać dane wejściowe innej jednostki.
Jednostki wykonawcze nie działają dobrze, jeśli próbują „analizować” dane i podejmować szereg decyzji na podstawie tych danych.
Te „bloki danych” mogą być częścią strumienia, takiego jak lista wierzchołków z tabeli stanów gry, dane MPEG z dysku itp.
Jeśli coś nie pasuje do tego modelu „przesyłania strumieniowego”, masz zadanie, którego nie można skutecznie sparaliżować, a procesor graficzny niekoniecznie jest najlepszym rozwiązaniem. Dobrym przykładem jest przetwarzanie „zdarzeń zewnętrznych” takich jak klawiatura, joystick lub wejście sieciowe. Nie ma wielu rzeczy, które nie pasują do tego modelu, ale zawsze będzie kilka.
źródło
To nie jest nic o szybkości zegara ani celu. Obaj są w stanie równie dobrze wykonać większość, jeśli nie wszystkie zadania; jednak niektóre są nieco lepiej dostosowane do niektórych zadań niż inne.
Nastąpił bardzo stary spór o to, czy lepiej jest mieć dużo głupich rdzenie lub małej grupy bardzo inteligentnych rdzeni. To łatwo wraca do lat 80-tych.
Wewnątrz procesora istnieje wiele możliwych obliczeń, które można wykonać. Mądrzejsze rdzenie są w stanie wykonywać wiele różnych obliczeń jednocześnie (coś w rodzaju wielordzeniowego, ale nie jest to skomplikowane; patrz paralelizm na poziomie instrukcji ). Inteligentny rdzeń może wykonywać kilka obliczeń jednocześnie (dodawanie, odejmowanie, mnożenie, dzielenie, operacja pamięci), ale tylko jedna na raz; z tego powodu są fizycznie większe (a zatem znacznie droższe) niż głupsze rdzenie.
Głupi rdzeń jest znacznie mniejszy i dlatego można dodać więcej do jednego układu, ale nie są w stanie wykonać tylu równoczesnych obliczeń. Istnieje równowaga między wieloma głupimi rdzeniami i kilkoma inteligentnymi rdzeniami.
Architektury wielordzeniowe działają dobrze z grafiką, ponieważ obliczenia można łatwo podzielić na setki rdzeni, ale zależy to również od jakości kodu i tego, czy inny kod opiera się na wyniku jednego obliczenia.
To jest o wiele bardziej skomplikowane pytanie, niż się może wydawać. Aby uzyskać więcej informacji, przeczytaj ten artykuł o projektowaniu procesora:
źródło
Chciałbym poruszyć jeden punkt syntaktyczny: Terminy CPU i GPU to nazwy funkcjonalne, a nie nazwy architektoniczne.
Gdyby komputer używał GPU jako głównego procesora, stałby się wówczas „jednostką centralną” (CPU), niezależnie od architektury i projektu.
źródło
Należy pamiętać, że w przestrzeni architektury nie ma magicznej linii podziału, która czyni jeden procesor „centralnym”, a drugi „graficznym”. (Cóż, niektóre procesory graficzne mogą być zbyt kalekie, aby być w pełni ogólne, ale nie o tych tutaj mówimy.)
Różnica polega na tym, jak są one instalowane na płycie i jakie zadania są im powierzone. Oczywiście używamy procesorów ogólnego przeznaczenia (lub zestawu procesorów ogólnego przeznaczenia) do głównego mechanizmu przenoszenia danych, a także specjalnej, równoległej, głęboko osadzonej jednostki dla rzeczy (takich jak grafika), aby jak najlepiej z nich skorzystać.
Większość sztuczek, które zostały wykorzystane do tego, aby procesory graficzne działały bardzo szybko, zostały po raz pierwszy opracowane przez ludzi próbujących tworzyć szybsze i lepsze procesory. Okazuje się, że Word, Excel i Netscape oraz wiele innych rzeczy, z których ludzie korzystają na swoich komputerach, nie tylko nie wykorzystują w pełni funkcji oferowanych przez układy graficzne, ale nawet działają wolniej na tych architekturach, ponieważ mają wiele przyczyn (bardzo drogie) i powolne) czyszczenie rur.
źródło
Istotą GPU było w ogóle uwolnienie procesora od kosztownych obliczeń graficznych, które wówczas wykonywał.
Łącząc je ponownie w pojedynczy procesor, wrócilibyśmy do miejsca, w którym wszystko się zaczęło.
źródło
Z prostego powodu: większość aplikacji nie jest wielowątkowa / wektoryzowana.
Karty graficzne w dużej mierze polegają na wielowątkowości, przynajmniej w koncepcji.
Porównaj samochód z jednym silnikiem, samochód z jednym mniejszym silnikiem na koło. W tym drugim samochodzie musisz sterować wszystkimi silnikami, co nie zostało uwzględnione z punktu widzenia programowania systemu.
Jednak dzięki fuzji AMD zmieni się sposób, w jaki będziemy musieli wykorzystać moc przetwarzania: albo wektoryzowana, albo szybka dla jednego wątku.
źródło
Powodem, dla którego nadal używamy procesorów jest to, że zarówno procesory, jak i procesory graficzne mają swoje unikalne zalety. Zobacz mój następny artykuł, zaakceptowany w ACM Computing Surveys 2015, który zawiera rozstrzygającą i kompleksową dyskusję na temat przejścia od „debaty o procesorze do GPU” do „wspólnej pracy z CPU-GPU”.
Badanie heterogenicznych technik obliczeniowych CPU-GPU
źródło
Mówiąc wprost, procesor graficzny można porównać do przyczepy w samochodzie. Jak zwykle bagażnik wystarcza większości ludzi, z wyjątkiem przypadków, gdy kupią coś naprawdę dużego. Wtedy mogą potrzebować przyczepy. To samo z GPU, ponieważ zwykle wystarczy zwykły procesor, który wykona większość zadań. Ale jeśli potrzebujesz intensywnych obliczeń w wielu wątkach, możesz potrzebować GPU
źródło
gpus to dobre procesory strumieniowe. możesz myśleć o przetwarzaniu strumieniowym po kolei, mnożąc długi szereg liczb. cpus ma również możliwości przetwarzania strumieniowego (nazywa się to rozszerzeniami SIMD), ale nie można zaimplementować całej logiki programowania jako przetwarzania strumieniowego, a kompilatory mają opcję tworzenia kodu bajtowego, który umożliwia korzystanie z instrukcji SIMD w miarę możliwości.
nie wszystko jest tablicą liczb. zdjęcia i filmy są, być może również dźwiękowe (tu i tam są kodery opencl). dzięki czemu gpus może przetwarzać, kodować i dekodować zdjęcia, filmy i cokolwiek podobnego. jedną wadą jest to, że nie można rozładować wszystkiego do gpus w grach, ponieważ spowodowałoby to zacinanie się, gpus jest zajęty grafiką i powinien być wąskim gardłem w systemie podczas grania w gry. optymalnym rozwiązaniem byłoby pełne wykorzystanie wszystkich elementów komputera. na przykład silnik physx nvidii domyślnie wykonuje obliczenia na jednostce centralnej, gdy jest ona w pełni wykorzystana.
źródło