Obliczenia ogólnego przeznaczenia na procesorach graficznych - General-purpose computing on graphics processing units

General-purpose computing na procesory graficzne ( GPGPU , lub rzadziej GPGP ) jest użycie grafiki jednostki przetwarzającej (GPU), które zwykle uchwyty obliczeń tylko dla grafiki komputerowej , do wykonywania obliczeń w aplikacjach tradycyjnie obsługiwanych przez jednostkę centralną ( PROCESOR). Użycie wielu kart graficznych w jednym komputerze lub dużej liczby układów graficznych dodatkowo zrównolegla już i tak równoległy charakter przetwarzania grafiki.

Zasadniczo potok GPGPU jest rodzajem przetwarzania równoległego między jednym lub większą liczbą procesorów graficznych i procesorów, które analizują dane tak, jakby były w postaci obrazu lub innej postaci graficznej. Chociaż procesory graficzne działają z niższymi częstotliwościami, zazwyczaj mają wielokrotnie większą liczbę rdzeni . Dzięki temu procesory GPU mogą przetwarzać znacznie więcej obrazów i danych graficznych na sekundę niż tradycyjny procesor. Migracja danych do postaci graficznej, a następnie użycie GPU do ich skanowania i analizy może znacznie przyspieszyć .

Potoki GPGPU zostały opracowane na początku XXI wieku do przetwarzania grafiki (np. dla lepszych shaderów ). Stwierdzono, że potoki te dobrze odpowiadają potrzebom obliczeń naukowych i od tego czasu są rozwijane w tym kierunku.

Historia

W zasadzie każda arbitralna funkcja logiczna , w tym funkcje dodawania, mnożenia i inne funkcje matematyczne, może być zbudowana z funkcjonalnie kompletnego zestawu operatorów logicznych. W 1987 roku Gra w życie Conwaya stała się jednym z pierwszych przykładów obliczeń ogólnego przeznaczenia wykorzystujących wczesny procesor strumieniowy zwany blitter do wywoływania specjalnej sekwencji operacji logicznych na wektorach bitowych.

Obliczenia ogólnego przeznaczenia na procesorach graficznych stały się bardziej praktyczne i popularne po około 2001 roku, wraz z pojawieniem się programowalnych shaderów i obsługi zmiennoprzecinkowej w procesorach graficznych. Warto zauważyć, że problemy związane z macierzami i/lub wektorami  – zwłaszcza wektorami dwu-, trójwymiarowymi lub czterowymiarowymi – można było łatwo przetłumaczyć na GPU, który działa z natywną szybkością i obsługuje te typy. Eksperymenty naukowej społeczności komputerowej z nowym sprzętem rozpoczęły się od procedury mnożenia macierzy (2001); jednym z pierwszych powszechnych programów naukowych, które działały szybciej na procesorach graficznych niż na procesorach, była implementacja faktoryzacji LU (2005).

Te wczesne próby wykorzystania GPU jako procesorów ogólnego przeznaczenia wymagały przeformułowania problemów obliczeniowych w zakresie prymitywów graficznych, wspieranych przez dwa główne interfejsy API dla procesorów graficznych, OpenGL i DirectX . To kłopotliwe tłumaczenie zostało wyeliminowane przez pojawienie się języków programowania ogólnego przeznaczenia i interfejsów API, takich jak Sh / RapidMind , Brook i Accelerator.

Po nich nastąpiła CUDA Nvidii , która pozwoliła programistom zignorować podstawowe koncepcje graficzne na rzecz bardziej powszechnych koncepcji obliczeń o wysokiej wydajności . Nowsze, niezależne od dostawców sprzętu oferty obejmują DirectCompute firmy Microsoft i OpenCL grupy Apple/Khronos . Oznacza to, że nowoczesne potoki GPGPU mogą wykorzystywać szybkość procesora graficznego bez konieczności pełnej i jawnej konwersji danych do postaci graficznej.

Realizacje

Każdy język, który umożliwia kodowi działającemu na procesorze odpytywanie modułu cieniującego GPU pod kątem zwracanych wartości, może tworzyć strukturę GPGPU.

Od 2016 r. OpenCL jest dominującym otwartym językiem obliczeniowym GPU ogólnego przeznaczenia i jest otwartym standardem zdefiniowanym przez Khronos Group . OpenCL zapewnia wieloplatformową platformę GPGPU, która dodatkowo obsługuje równoległe przetwarzanie danych na procesorach. OpenCL jest aktywnie wspierany na platformach Intel, AMD, Nvidia i ARM. Grupa Khronos ustandaryzowała i zaimplementowała również SYCL , model programowania wyższego poziomu dla OpenCL jako języka wbudowanego z jednym kodem źródłowym opartego na czystym C++11.

Dominującym autorskim frameworkiem jest Nvidia CUDA . Nvidia wprowadziła CUDA w 2006 roku, zestaw do tworzenia oprogramowania (SDK) i interfejs programowania aplikacji (API), który umożliwia używanie języka programowania C do kodowania algorytmów do wykonania na procesorach graficznych z serii GeForce 8 i nowszych.

Standardy programowania dla obliczeń równoległych obejmują OpenCL (niezależny od dostawcy), OpenACC i OpenHMPP . Mark Harris , założyciel GPGPU.org, ukuł termin GPGPU .

ten Xcelerit SDK , stworzony przezXcelerit, jest przeznaczony do przyspieszania dużych istniejącychbaz koduC++lubC#naprocesorach GPUprzy minimalnym wysiłku. Zapewnia uproszczony model programowania, automatyzuje równoległość, zarządza urządzeniami i pamięcią oraz kompiluje doplików binarnychCUDA. Dodatkowo, wielordzenioweprocesoryi inne akceleratory mogą być kierowane z tego samego kodu źródłowego.

OpenVIDIA została opracowana na Uniwersytecie w Toronto w latach 2003-2005 we współpracy z Nvidią .

Altimesh Hybridizer stworzony przezAltimeshkompilujeCommon Intermediate Languagedoplików binarnychCUDA. Obsługuje funkcje generyczne i wirtualne. Debugowanie i profilowanie jest zintegrowane zVisual StudioiNsight. Jest dostępny jako rozszerzenie programu Visual Studio w witrynieVisual Studio Marketplace.

Firma Microsoft wprowadziła interfejs API obliczeniowy DirectCompute GPU, wydany z interfejsem API DirectX 11.

Procesor graficzny Alea stworzony przez QuantAlea wprowadza natywne możliwości obliczeniowe GPU dlajęzykaMicrosoft.NETF#iC#. Alea GPU zapewnia również uproszczony model programowania GPU oparty na równoległym i równoległym agregacji GPU z wykorzystaniem delegatów i automatycznego zarządzania pamięcią.

MATLAB obsługuje akcelerację GPGPU za pomocą programu Parallel Computing Toolbox i MATLAB Distributed Computing Server oraz pakietów innych firm, takich jak Jacket .

Przetwarzanie GPGPU jest również wykorzystywane do symulacji fizyki Newtona przez silniki fizyki , a komercyjne implementacje obejmują Havok Physics, FX i PhysX , które są zwykle używane w grach komputerowych i wideo .

Close to Metal , teraz nazywane Stream , to technologia AMD GPGPU przeznaczona dla procesorów graficznych ATI Radeon.

C++ Accelerated Massive Parallelism ( C++ AMP ) to biblioteka, która przyspiesza wykonywanie kodu C++ poprzez wykorzystanie sprzętu do równoległego przetwarzania danych na procesorach graficznych.

Komputery mobilne

W związku z trendem zwiększania mocy mobilnych procesorów graficznych, programowanie ogólnego przeznaczenia stało się dostępne także na urządzeniach mobilnych z głównymi mobilnymi systemami operacyjnymi .

Google Android 4.2 umożliwił uruchamianie kodu RenderScript na procesorze graficznym urządzenia mobilnego. Firma Apple wprowadziła zastrzeżony interfejs API Metal dla aplikacji iOS , który jest w stanie wykonać dowolny kod za pomocą shaderów obliczeniowych GPU firmy Apple.

Wsparcie sprzętowe

Komputerowe karty graficzne są produkowane przez różnych producentów, takich jak Nvidia , AMD i ATI . Karty takich dostawców różnią się implementacją obsługi formatów danych, takich jak formaty całkowite i zmiennoprzecinkowe (32-bitowe i 64-bitowe). Firma Microsoft wprowadziła standard Shader Model , aby pomóc w uporządkowaniu różnych funkcji kart graficznych w prosty numer wersji Shader Model (1.0, 2.0, 3.0 itd.).

Liczby całkowite

Karty graficzne Pre-DirectX 9 obsługują tylko kolory z paletą lub liczbą całkowitą. Dostępne są różne formaty, z których każdy zawiera element czerwony, element zielony i element niebieski. Czasami dodawana jest inna wartość alfa, która ma być używana do przezroczystości. Popularne formaty to:

  • 8 bitów na piksel – Czasami tryb palety, w którym każda wartość jest indeksem w tabeli z rzeczywistą wartością koloru określoną w jednym z pozostałych formatów. Czasem trzy bity na czerwony, trzy bity na zielony i dwa bity na niebieski.
  • 16 bitów na piksel — zwykle bity są przydzielane jako pięć bitów dla koloru czerwonego, sześć bitów dla koloru zielonego i pięć bitów dla koloru niebieskiego.
  • 24 bity na piksel — jest osiem bitów na każdy z kolorów czerwonego, zielonego i niebieskiego.
  • 32 bity na piksel — jest osiem bitów na każdy z kolorów czerwonego, zielonego, niebieskiego i alfa .

Liczb zmiennoprzecinkowych

W przypadku wczesnych grafik o stałych funkcjach lub ograniczonej programowalności (tj. włącznie z procesorami graficznymi zgodnymi z DirectX 8.1) było to wystarczające, ponieważ jest to również reprezentacja używana w wyświetlaczach. Należy zauważyć, że ta reprezentacja ma pewne ograniczenia. Biorąc pod uwagę wystarczającą moc przetwarzania grafiki, nawet programiści grafiki chcieliby używać lepszych formatów, takich jak formaty danych zmiennoprzecinkowych , w celu uzyskania efektów, takich jak obrazowanie o wysokim zakresie dynamicznym . Wiele aplikacji GPGPU wymaga dokładności zmiennoprzecinkowej, która jest dostarczana z kartami wideo zgodnymi ze specyfikacją DirectX 9.

DirectX 9 Shader Model 2.x sugerował obsługę dwóch typów precyzji: pełnej i częściowej precyzji. Pełna obsługa precyzji mogła być FP32 lub FP24 (zmiennoprzecinkowa 32- lub 24-bitowa na komponent) lub większa, podczas gdy precyzja częściowa to FP16. ATI Radeon R300 seria GPU obsługiwane FP24 dokładność tylko w programowalnej fragment rurociągu (chociaż FP32 zostały w procesorach Vertex) podczas Nvidia jest NV30 serii obsługiwany zarówno FP16 i FP32; inni dostawcy, tacy jak S3 Graphics i XGI, obsługiwali mieszankę formatów aż do FP24.

Implementacje zmiennoprzecinkowe na procesorach graficznych Nvidia są w większości zgodne z IEEE ; jednak nie dotyczy to wszystkich dostawców. Ma to wpływ na poprawność, która jest uważana za ważną dla niektórych zastosowań naukowych. Chociaż 64-bitowe wartości zmiennoprzecinkowe (zmiennoprzecinkowe o podwójnej precyzji) są powszechnie dostępne na procesorach, nie są one powszechnie obsługiwane przez procesory graficzne. Niektóre architektury GPU poświęcają zgodność ze standardem IEEE, podczas gdy innym brakuje podwójnej precyzji. Podjęto wysiłki w celu emulowania wartości zmiennoprzecinkowych podwójnej precyzji na procesorach graficznych; Jednak kompromis w zakresie prędkości neguje wszelkie korzyści z przeniesienia obliczeń na GPU.

Wektoryzacja

Większość operacji na GPU działa w sposób wektorowy: jedną operację można wykonać na maksymalnie czterech wartościach jednocześnie. Na przykład, jeśli jeden kolor <R1, G1, B1> ma być modulowany innym kolorem <R2, G2, B2>, GPU może wytworzyć wynikowy kolor <R1*R2, G1*G2, B1*B2> w jednym operacja. Funkcjonalność ta jest przydatna w grafice, ponieważ prawie każdy podstawowy typ danych to wektor (dwu-, trzy- lub czterowymiarowy). Przykładami są wierzchołki, kolory, wektory normalne i współrzędne tekstury. Wiele innych aplikacji może to dobrze wykorzystać, a ze względu na ich wyższą wydajność, instrukcje wektorowe, zwane pojedynczą instrukcją, wieloma danymi ( SIMD ), są od dawna dostępne w procesorach.

GPU a procesor

Pierwotnie dane były po prostu przekazywane w jedną stronę z jednostki centralnej (CPU) do procesora graficznego (GPU), a następnie do urządzenia wyświetlającego . Jednak w miarę upływu czasu stało się cenne dla procesorów graficznych, aby przechowywać najpierw proste, a następnie złożone struktury danych, które mają być przesyłane z powrotem do procesora, który analizował obraz, lub zestaw danych naukowych przedstawionych w formacie 2D lub 3D, który karta graficzna może zrozumieć. Ponieważ procesor graficzny ma dostęp do każdej operacji rysowania, może szybko analizować dane w tych formach, podczas gdy procesor musi odpytywać każdy piksel lub element danych znacznie wolniej, ponieważ szybkość dostępu między procesorem a jego większą pulą pamięci o dostępie swobodnym (lub w jeszcze gorszym przypadku dysk twardy ) jest wolniejszy niż procesory graficzne i karty graficzne, które zazwyczaj zawierają mniejsze ilości droższej pamięci, do której dostęp jest znacznie szybszy. Przeniesienie części zestawu danych do aktywnej analizy do tej pamięci GPU w postaci tekstur lub innych łatwych do odczytania form GPU powoduje wzrost prędkości. Cechą wyróżniającą projekt GPGPU jest możliwość dwukierunkowego przesyłania informacji z powrotem z GPU do CPU; ogólnie przepustowość danych w obu kierunkach jest idealnie wysoka, co skutkuje efektem mnożnikowym na szybkość określonego algorytmu o dużym natężeniu . Potoki GPGPU mogą poprawić wydajność szczególnie dużych zbiorów danych i/lub danych zawierających obrazy 2D lub 3D. Jest używany w złożonych potokach graficznych, a także w obliczeniach naukowych ; tym bardziej w dziedzinach z dużymi zestawami danych, takich jak mapowanie genomu lub tam, gdzie przydatna jest analiza dwu- lub trójwymiarowa – zwłaszcza w chwili obecnej analiza biomolekuł , badania białek i inne złożone chemie organiczne . Takie potoki mogą również znacznie poprawić wydajność przetwarzania obrazu i wizji komputerowej , między innymi; jak również przetwarzanie równoległe . Niektóre bardzo mocno zoptymalizowane potoki przyniosły kilkusetkrotny wzrost szybkości w stosunku do oryginalnego potoku opartego na procesorze w jednym zadaniu o dużym natężeniu.

Prostym przykładem może być program GPU, który zbiera dane o średnich wartościach oświetlenia , ponieważ renderuje część widoku z kamery lub programu graficznego komputerowego z powrotem do głównego programu na procesorze, aby procesor mógł następnie dokonać korekty całego ekranu pogląd. Bardziej zaawansowany przykład może wykorzystywać wykrywanie krawędzi do zwracania zarówno informacji numerycznych, jak i przetworzonego obrazu przedstawiającego kontury do programu komputerowego sterującego, powiedzmy, robotem mobilnym. Ponieważ GPU ma szybki i lokalny dostęp sprzętowy do każdego piksela lub innego elementu obrazu w obrazie, może go analizować i uśredniać (dla pierwszego przykładu) lub zastosować filtr krawędzi Sobela lub inny filtr konwolucji (dla drugiego) z dużo większym prędkość niż procesor, który zazwyczaj musi uzyskać dostęp do wolniejszych kopii pamięci o dostępie swobodnym danej grafiki.

GPGPU to zasadniczo koncepcja oprogramowania, a nie koncepcja sprzętu; jest to rodzaj algorytmu , a nie element wyposażenia. Specjalistyczne projekty sprzętu mogą jednak jeszcze bardziej zwiększyć wydajność potoków GPGPU, które tradycyjnie wykonują stosunkowo niewiele algorytmów na bardzo dużych ilościach danych. Masowo zrównoleglone zadania na gigantycznym poziomie danych mogą być zatem jeszcze bardziej zrównoleglone poprzez wyspecjalizowane konfiguracje, takie jak przetwarzanie w stojaku (wiele podobnych, wysoce dostosowanych maszyn wbudowanych w stojak ), co dodaje trzecią warstwę – wiele jednostek obliczeniowych, z których każda wykorzystuje wiele procesorów do wielu procesorów graficznych. Niektóre Bitcoin „górnicy” używał takich ustawień dla przetwarzania dużej ilości.

Pamięć podręczna

W przeszłości procesory wykorzystywały pamięci podręczne zarządzane sprzętowo , ale wcześniejsze procesory graficzne zapewniały tylko pamięć lokalną zarządzaną programowo. Ponieważ jednak procesory graficzne są coraz częściej wykorzystywane w zastosowaniach ogólnego przeznaczenia, najnowocześniejsze procesory graficzne są projektowane z zarządzanymi sprzętowo wielopoziomowymi pamięciami podręcznymi, które pomogły procesorom graficznym przejść do głównego nurtu obliczeniowego. Na przykład procesory graficzne z serii GeForce 200 GT200 nie były wyposażone w pamięć podręczną L2, procesor graficzny Fermi ma 768 KiB pamięci podręcznej ostatniego poziomu, procesor graficzny Kepler ma 1,5 MB pamięci podręcznej ostatniego poziomu, procesor graficzny Maxwell ma 2 MB pamięci podręcznej ostatniego poziomu, a Pascal GPU ma 4 MIB ostatnim poziomie cache.

Zarejestruj plik

Procesory graficzne mają bardzo duże pliki rejestrów , co pozwala im zmniejszyć opóźnienia związane z przełączaniem kontekstu. Rozmiar pliku rejestru również wzrasta wraz z różnymi generacjami GPU, np. całkowity rozmiar pliku rejestru na procesorach graficznych Maxwell (GM200), Pascal i Volta wynosi odpowiednio 6 MiB, 14 MiB i 20 MiB. Dla porównania rozmiar pliku rejestru na procesorach jest mały, zwykle dziesiątki lub setki kilobajtów.

Efektywności energetycznej

Wysoka wydajność procesorów graficznych odbywa się kosztem wysokiego zużycia energii, które przy pełnym obciążeniu jest w rzeczywistości taką samą mocą, jak cała reszta systemu PC razem wzięta. Maksymalny pobór mocy procesora graficznego z serii Pascal (Tesla P100) określono na 250W.

Przetwarzanie strumienia

GPU są zaprojektowane specjalnie dla grafiki i dlatego są bardzo restrykcyjne w operacjach i programowaniu. Ze względu na swoją konstrukcję procesory graficzne są skuteczne tylko w przypadku problemów, które można rozwiązać za pomocą przetwarzania strumieniowego, a sprzęt może być używany tylko w określony sposób.

Poniższa dyskusja dotycząca wierzchołków, fragmentów i tekstur dotyczy głównie starszego modelu programowania GPGPU, w którym graficzne API ( OpenGL lub DirectX ) były wykorzystywane do wykonywania obliczeń ogólnego przeznaczenia. Wraz z wprowadzeniem interfejsów API ogólnego przeznaczenia CUDA (Nvidia, 2007) i OpenCL (niezależne od dostawcy, 2008), w nowych kodach GPGPU nie jest już konieczne mapowanie obliczeń na prymitywy graficzne. Charakter przetwarzania strumieniowego procesorów graficznych pozostaje prawidłowy niezależnie od używanych interfejsów API. (Patrz np.)

Procesory GPU mogą przetwarzać tylko niezależne wierzchołki i fragmenty, ale mogą przetwarzać wiele z nich równolegle. Jest to szczególnie skuteczne, gdy programista chce przetwarzać wiele wierzchołków lub fragmentów w ten sam sposób. W tym sensie procesory graficzne to procesory strumieniowe — procesory, które mogą działać równolegle, uruchamiając jedno jądro na wielu rekordach w strumieniu jednocześnie.

Strumień jest po prostu zbiorem zapisów, które wymagają podobnego obliczenia. Strumienie zapewniają równoległość danych. Jądra to funkcje stosowane do każdego elementu w strumieniu. W procesorach graficznych wierzchołki i fragmenty są elementami strumieni, a shadery wierzchołków i fragmentów są jądrami, które można na nich uruchomić. Dla każdego elementu możemy tylko czytać z wejścia, wykonywać na nim operacje i zapisywać na wyjściu. Dozwolone jest posiadanie wielu wejść i wielu wyjść, ale nigdy fragmentu pamięci, który jest zarówno odczytywalny, jak i zapisywalny.

Intensywność arytmetyczna jest definiowana jako liczba operacji wykonywanych na przeniesione słowo pamięci. Dla aplikacji GPGPU ważne jest, aby miały wysoką intensywność arytmetyczną, w przeciwnym razie opóźnienie dostępu do pamięci ograniczy przyspieszenie obliczeniowe.

Idealne aplikacje GPGPU mają duże zestawy danych, wysoką równoległość i minimalną zależność między elementami danych.

Koncepcje programowania GPU

Zasoby obliczeniowe

Na GPU dostępnych jest wiele zasobów obliczeniowych:

  • Programowalne procesory – wierzchołki, prymitywne, fragmentaryczne i głównie potoki obliczeniowe umożliwiają programiście wykonanie jądra na strumieniach danych
  • Rasteryzator – tworzy fragmenty i interpoluje stałe per-vertex, takie jak współrzędne tekstury i kolor
  • Jednostka tekstury – interfejs pamięci tylko do odczytu
  • Framebuffer – interfejs pamięci tylko do zapisu

W rzeczywistości program może zamiast bufora ramki zastąpić teksturę tylko do zapisu. Odbywa się to za pomocą funkcji Renderuj na teksturę (RTT), Render-To-Backbuffer-Copy-To-Texture (RTBCTT) lub nowszego strumienia.

Tekstury jako strumień

Najpopularniejszą formą strumienia przyjmowanego przez GPGPU jest siatka 2D, ponieważ pasuje ona naturalnie do modelu renderowania wbudowanego w GPU. Wiele obliczeń w naturalny sposób mapuje się na siatki: algebra macierzowa, przetwarzanie obrazu, symulacja fizyczna i tak dalej.

Ponieważ tekstury są używane jako pamięć, wyszukiwania tekstur są następnie używane jako odczyty pamięci. Z tego powodu niektóre operacje mogą być wykonywane automatycznie przez GPU.

Jądra

Jądra obliczeniowe można traktować jako ciało pętli . Na przykład programista działający w siatce na CPU może mieć kod, który wygląda tak:

// Input and output grids have 10000 x 10000 or 100 million elements.

void transform_10k_by_10k_grid(float in[10000][10000], float out[10000][10000])
{
    for (int x = 0; x < 10000; x++) {
        for (int y = 0; y < 10000; y++) {
            // The next line is executed 100 million times
            out[x][y] = do_some_hard_work(in[x][y]);
        }
    }
}

Na procesorze graficznym programista określa tylko ciało pętli jako jądro i jakie dane należy zapętlić, wywołując przetwarzanie geometrii.

Kontrola przepływu

W kodzie sekwencyjnym można sterować przebiegiem programu za pomocą instrukcji if-the-else oraz różnych form pętli. Takie struktury kontroli przepływu zostały dopiero niedawno dodane do procesorów graficznych. Zapisy warunkowe można było wykonać przy użyciu odpowiednio spreparowanej serii operacji arytmetycznych/bitowych, ale nie było możliwe tworzenie pętli i warunkowego rozgałęzienia.

Najnowsze procesory graficzne umożliwiają rozgałęzianie, ale zwykle z obniżeniem wydajności. Zasadniczo należy unikać rozgałęziania w pętlach wewnętrznych, zarówno w kodzie procesora, jak i GPU, a do osiągnięcia rozgałęzienia można użyć różnych metod, takich jak statyczna rozdzielczość gałęzi, obliczenia wstępne, predykacja, dzielenie pętli i cull istnieć.

Metody GPU

Mapa

Operacja mapowania po prostu stosuje daną funkcję (jądro) do każdego elementu w strumieniu. Prostym przykładem jest pomnożenie każdej wartości w strumieniu przez stałą (zwiększenie jasności obrazu). Operacja mapy jest łatwa do zaimplementowania na GPU. Programista generuje fragment dla każdego piksela na ekranie i stosuje program fragmentów do każdego z nich. Strumień wynikowy o tym samym rozmiarze jest przechowywany w buforze wyjściowym.

Zmniejszyć

Niektóre obliczenia wymagają obliczenia mniejszego strumienia (prawdopodobnie strumienia tylko jednego elementu) z większego strumienia. Nazywa się to redukcją strumienia. Zasadniczo redukcję można przeprowadzić w wielu krokach. Wyniki z poprzedniego etapu są wykorzystywane jako dane wejściowe dla bieżącego etapu, a zakres, w którym wykonywana jest operacja, jest zmniejszany, aż pozostanie tylko jeden element strumienia.

Filtrowanie strumienia

Filtrowanie strumienia jest zasadniczo nierównomierną redukcją. Filtrowanie polega na usuwaniu elementów ze strumienia na podstawie pewnych kryteriów.

Skanowanie

Operacja skanowania, zwana również równoległą sumą prefiksów , obejmuje wektor (strumień) elementów danych i (dowolną) asocjacyjną funkcję binarną „+” z elementem tożsamości „i” . Jeśli dane wejściowe to [a0, a1, a2, a3, ...], skanowanie wyłączne daje wynik [i, a0, a0 + a1, a0 + a1 + a2, ...], podczas gdy skanowanie włączające daje wynik [i, a0, a0 + a1, a0 + a1 + a2, ...] wyjście [a0, a0 + a1, a0 + a1 + a2, a0 + a1 + a2 + a3, ...] i nie wymaga istnienia tożsamości . Chociaż na pierwszy rzut oka operacja może wydawać się z natury szeregowa, możliwe są wydajne algorytmy skanowania równoległego, które zostały zaimplementowane w procesorach graficznych. Operacja skanowania ma zastosowanie np. w szybkim sortowaniu i rzadkim mnożeniu wektora macierzy.

Rozpraszać

Operacja scatter jest najbardziej naturalnie zdefiniowana w procesorze wierzchołków. Procesor wierzchołków jest w stanie dostosować położenie wierzchołka , co pozwala programiście kontrolować, gdzie na siatce znajdują się informacje. Możliwe są również inne rozszerzenia, takie jak kontrolowanie wielkości obszaru, na który wpływa wierzchołek.

Procesor fragmentów nie może wykonać bezpośredniej operacji rozproszenia, ponieważ położenie każdego fragmentu na siatce jest ustalone w momencie tworzenia fragmentu i nie może zostać zmienione przez programistę. Jednak czasami operacja rozproszenia logicznego może zostać przekształcona lub zaimplementowana w innym kroku gromadzenia. Implementacja rozproszona najpierw wyemituje zarówno wartość wyjściową, jak i adres wyjściowy. Bezpośrednio następująca operacja zbierania wykorzystuje porównania adresów w celu sprawdzenia, czy wartość wyjściowa jest mapowana na bieżące gniazdo wyjściowe.

W dedykowanych jądrach obliczeniowych rozpraszanie może być wykonywane przez zapisy indeksowane.

Zbierać

Zbieranie jest odwrotnością rozpraszania. Po tym, jak rozproszenie zmieni kolejność elementów zgodnie z mapą, funkcja Collect może przywrócić kolejność elementów zgodnie z użytym rozproszeniem na mapie. W dedykowanych jądrach obliczeniowych gromadzenie może być wykonywane przez odczyty indeksowane. W innych shaderach odbywa się to za pomocą wyszukiwania tekstur.

Sortować

Operacja sortowania przekształca nieuporządkowany zestaw elementów w uporządkowany zestaw elementów. Najczęstszą implementacją na procesorach graficznych jest użycie sortowania radix dla danych całkowitych i zmiennoprzecinkowych oraz sortowania gruboziarnistego przez scalanie i sieci sortowania drobnoziarnistego dla ogólnych porównywalnych danych.

Szukaj

Operacja wyszukiwania pozwala programiście znaleźć dany element w strumieniu lub ewentualnie znaleźć sąsiadów określonego elementu. GPU nie jest używany do przyspieszenia wyszukiwania pojedynczego elementu, ale jest używany do równoległego uruchamiania wielu wyszukiwań. Najczęściej stosowaną metodą wyszukiwania jest wyszukiwanie binarne na posortowanych elementach.

Struktury danych

Na GPU można reprezentować różne struktury danych:

Aplikacje

Poniżej przedstawiono niektóre obszary, w których procesory GPU były używane do obliczeń ogólnego przeznaczenia:

Bioinformatyka

Wykorzystanie GPGPU w Bioinformatyce:

Podanie Opis Obsługiwane funkcje Oczekiwane przyspieszenie† GPU‡ Obsługa wielu GPU Stan wydania
BarraCUDA DNA, w tym epigenetyka, oprogramowanie do mapowania sekwencji Wyrównanie krótkich odczytów sekwencjonowania 6–10x T 2075, 2090, K10, K20, K20X tak Dostępne teraz , wersja 0.7.107f
CUDASW++ Oprogramowanie typu open source do przeszukiwania bazy danych białek Smith-Waterman na procesorach graficznych Równoległe przeszukiwanie bazy danych Smitha-Watermana 10-50x T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 2.0.8
CUSZA Zrównoleglony wyrównywacz krótkiego odczytu Równoległe, dokładne wyrównanie do długiego odczytu – wyrównania z przerwami do dużych genomów 10x T 2075, 2090, K10, K20, K20X tak Dostępny już teraz, wersja 1.0.40
GPU-BLAST Wyszukiwanie lokalne z szybką heurystyką k- tuple Wyrównanie białek zgodnie z blastp, wielowątkowymi procesorami 3-4x T 2075, 2090, K10, K20, K20X Tylko pojedyncze Dostępne teraz, wersja 2.2.26
GPU-HMMER Zrównoleglone wyszukiwanie lokalne i globalne z ukrytymi modelami Markowa w profilu Równoległe lokalne i globalne wyszukiwanie ukrytych modeli Markowa 60–100x T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 2.3.2
mCUDA-MEME Ultraszybki skalowalny algorytm wykrywania motywów oparty na MEME Skalowalny algorytm wykrywania motywów oparty na MEME 4–10x T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 3.0.12
SeqNFFind Zestaw narzędzi do analizy sekwencji przyspieszanych przez GPU Montaż referencyjny, wybuch, Smith–Waterman, hmm, montaż de novo 400x T 2075, 2090, K10, K20, K20X tak Już dostępny
UGENE Opensource Smith–Waterman dla SSE/CUDA, wyszukiwarka powtórzeń oparta na tablicy sufiksów i wykres kropkowy Szybkie wyrównanie krótkiego odczytu 6–8x T 2075, 2090, K10, K20, K20X tak Dostępny już teraz, wersja 1.11
SzerokiLM Pasuje do wielu modeli liniowych o stałej konstrukcji i odpowiedzi Równoległa regresja liniowa na wielu modelach o podobnym kształcie 150x T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 0.1-1

Dynamika molekularna

Podanie Opis Obsługiwane funkcje Oczekiwane przyspieszenie† GPU‡ Obsługa wielu GPU Stan wydania
Uchowiec Modeluje dynamikę molekularną biopolimerów do symulacji białek, DNA i ligandów Rozpuszczalnik jawny i niejawny, hybrydowy Monte Carlo 4–120x T 2075, 2090, K10, K20, K20X Tylko pojedyncze Dostępne teraz, wersja 1.8.88
ACEMD Symulacja GPU pól siłowych mechaniki molekularnej, rozpuszczalnika niejawnego i jawnego Napisany do użytku na GPU Tylko wersja GPU 160 ns/dzień T 2075, 2090, K10, K20, K20X tak Już dostępny
BURSZTYN Pakiet programów do symulacji dynamiki molekularnej biomolekuły PMEMD: rozpuszczalnik jawny i niejawny 89,44 ns/dzień JAC NVE T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 12 + poprawka 9
DL-POLY Symuluj makrocząsteczki, polimery, układy jonowe itp. na komputerze równoległym z pamięcią rozproszoną Siły dwuciałowe, pary ogniwo-łącze, siły Ewalda SPME, wstrząs VV 4x T 2075, 2090, K10, K20, K20X tak Dostępne teraz, tylko źródło w wersji 4.0
UROK Pakiet MD do symulacji dynamiki molekularnej na biocząsteczce. Niejawny (5x), jawny (2x) rozpuszczalnik przez OpenMM TBD T 2075, 2090, K10, K20, K20X tak W fazie rozwoju Q4/12
GROMAKI Symuluj cząsteczki biochemiczne o złożonych interakcjach wiązań Niejawny (5x), jawny (2x) rozpuszczalnik 165 ns/dzień DHFR T 2075, 2090, K10, K20, K20X Tylko pojedyncze Dostępna teraz, wersja 4.6 w Q4/12
HOOMD-Niebieski Pakiet dynamiki cząstek napisany pod kątem GPU Napisany dla GPU 2x T 2075, 2090, K10, K20, K20X tak Już dostępny
LAMPY Pakiet klasycznej dynamiki molekularnej Lennard-Jones, Morse, Buckingham, CHARMM, tabelaryczny, zbożowy SDK, anizotropowy Gay-Bern, RE-kwadrat, kombinacje „hybrydowe” 3-18x T 2075, 2090, K10, K20, K20X tak Już dostępny
NAMD Zaprojektowany do wysokowydajnej symulacji systemów wielkocząsteczkowych Zdolność do atomu 100M 6,44 ns/dzień STMV 585x 2050s T 2075, 2090, K10, K20, K20X tak Dostępny już teraz, wersja 2.9
Otwórz MM Biblioteka i aplikacja do dynamiki molekularnej dla HPC z GPU Dorozumiane i jawne rozpuszczalniki, siły niestandardowe Niejawny: 127–213 ns/dzień; Jawne: 18–55 ns/dzień DHFR T 2075, 2090, K10, K20, K20X tak Dostępne teraz, wersja 4.1.1

† Oczekiwane przyspieszenia są w dużym stopniu zależne od konfiguracji systemu. Wydajność GPU w porównaniu z wielordzeniowym procesorem x86 . Wydajność GPU została przetestowana na obsługiwanych funkcjach GPU i może być porównaniem wydajności jądra z jądrem. Szczegółowe informacje na temat używanej konfiguracji można znaleźć w witrynie internetowej aplikacji. Przyspieszenia zgodnie z wewnętrznymi testami Nvidii lub dokumentacją ISV.

‡ Q= GPU Quadro , T= GPU Tesla . Nvidia poleca procesory graficzne dla tej aplikacji. Skontaktuj się z deweloperem lub niezależnym dostawcą oprogramowania, aby uzyskać informacje o certyfikacji.

Zobacz też

Bibliografia

Zewnętrzne linki