CUDA

CUDA
VývojářNVIDIA Corp.
Aktuální verze12.6.1 (srpen 2024)
Operační systémMS Windows, GNU/Linux
Platformapodporovaná GPU
Typ softwaruGPGPU
Licencefreeware
Webwww.nvidia.com
Některá data mohou pocházet z datové položky.

CUDA (akronymangl. Compute Unified Device Architecture, výslovnost [ˈkjuːdə]) je hardwarová a softwarová architektura,[1] která umožňuje na vybraných GPU spouštět programy napsané v jazycích C/C++, Fortran nebo programy postavené na technologiích OpenCL, DirectCompute a jiných. Použití této architektury je omezeno pouze na grafické akcelerátory a výpočetní karty společnosti nVIDIA, která ji vyvinula. Konkurenční technologie společnosti AMD se nazývá AMD FireStream (dříve Close To Metal). Obě společnosti jsou také členy Khronos Group, která zajišťuje vývoj OpenCL.

Historie

Technologii představila společnost nVIDIA v roce 2006. Následujícího roku bylo uvolněno SDK ve verzi 1.0 pro karty nVIDIA Tesla založené na architektuře G80. Ještě v prosinci téhož roku vyšla verze CUDA SDK 1.1, která přidala podporu pro GPU série GeForce 8. Se správným ovladačem grafické karty přibyla podpora pro překrývání paměťových přenosů výpočtem a podpora pro více GPU akcelerátorů.

V roce 2008 bylo vydáno současně s architekturou G200 SDK 2.0. Postupně s verzemi SDK 2.0–2.3 přibývala podpora pro emulovaný výpočet s dvojnásobnou přesností (double-precision) a podpora pro C++ šablony v rámci kernelu.

V roce 2010 bylo spolu s mikroarchitekturou Fermi vydáno SDK 3.0, obsahující nativní podporu pro výpočty s dvojnásobnou přesností, podporu pro ukazatele na funkce a podporu rekurze. Vylepšeny byly též profilovací nástroje a debuggery pro CUDA / OpenCL.

V květnu 2011 byla vydána verze CUDA SDK 4.0. Největší změnou je zde unifikace paměťových prostorů a masivní podpora MultiGPU.

Do roku 2020 CUDA podporovala operační systém macOS, nicméně s vydáním verze 11 tato podpora skončila.

Mikroarchitektura GPU

CPU vs. GPU

Drtivou většinu plochy čipu grafického akcelerátoru od nVidie zabírá velké množství relativně jednoduchých skalárních procesorů (na rozdíl od architektur konkurenční firmy AMD, jejíž GPU jsou tvořeny VLIW SIMD, resp. RISC SIMD jednotkami, tzv. stream procesory), které jsou organizovány do větších celků zvaných streaming multiprocesory. Vzhledem k tomu, že se jedná o SIMT architekturu, řízení jednotek a plánování instrukcí je jednoduché a spolu s velmi malou vyrovnávací pamětí zabírá malé procento plochy GPU čipu. To má bohužel za následek omezené predikce skoků a časté zdržení výpadky cache (některé typy pamětí dokonce nejsou opatřeny cache). Poslední významnou částí, která je rozměrově velice podobná CPU je RAM řadič.

Struktura multiprocesoru

Schéma streaming multiprocesoru architektury Fermi

Obecně se multiprocesor skládá z několika (dnes až ze 32) stream procesorů, pole registrů, sdílené paměti, několika load/store jednotek a Special Function Unit – jednotky pro výpočet složitějších funkcí jako sin, cos, ln.

Výpočetní možnosti (Compute capability)

Výpočetní možnosti popisují vlastnosti zařízení a množinu instrukcí, které jsou podporovány. Některé z těchto vlastností jsou shrnuty v tabulce níže, ostatní lze nalézt v oddílu F nVIDIA CUDA C Programming Guide.[2]

Výpočetní možnosti zařízení (compute capability)
Vlastnost 1.0 1.1 1.2 1.3 2.x
Maximální dimenze mřížky bloků 2 4
Maximální x-, y- nebo z- rozměr mřížky bloků 65 535
Maximální dimenze bloku vláken 3
Maximální x-, y- rozměr bloku vláken 512 1 024
Maximální z-rozměr bloku vláken 64
Maximální počet vláken v bloku 512 1 024
Velikost warpu 32
Maximální počet bloků přidělených na multiprocesor 8
Maximální počet warpů přidělených na multiprocesor 24 32 48
Maximální počet vláken přidělených na multiprocesor 768 1 024 1 536
Počet 32bitových registrů na multiprocesor 8 000 16 000 32 000
Maximální množství sdílené paměti na multiprocesor 16 KiB 48 KiB
Počet sdílených paměťových banků 16 32
Množství lokální paměti na vlákno 16 KiB 512 KiB
Velikost konstantní paměti 64 KiB
Velikost cache pro konstantní paměť na multiprocesor 8 KiB
Velikost cache pro texturovací paměť na multiprocesor Závislé na zařízení, mezi 6 KiB a 8 KiB
Maximální počet textur na jeden kernel 128
Maximální počet instrukcí na jeden kernel 2 000 000
Podpora výpočtů v double-precision Ne Ano

Programovací model

Uspořádání vláken a bloků

CUDA aplikace je složena z částí, které běží buď na host (CPU) nebo na CUDA zařízení (GPU). Části aplikace běžící na zařízení jsou spouštěny hostem zavoláním kernelu, což je funkce, která je prováděna každým spuštěným vláknem (thread [θred]).

Blok (thread block)
Vlákna jsou organizována do 1D, 2D nebo 3D bloků, kde vlákna ve stejném bloku mohou sdílet data a lze synchronizovat jejich běh. Počet vláken na jeden blok je závislý na výpočetních možnostech zařízení. Každé vlákno je v rámci bloku identifikováno unikátním indexem přístupným ve spuštěném kernelu přes zabudovanou proměnou threadIdx.
Mřížka (grid)
Bloky jsou organizovány do 1D, 2D nebo 3D mřížky. Blok lze v rámci mřížky identifikovat unikátním indexem přístupným ve spuštěném kernelu přes zabudovanou proměnou blockIdx. Každý blok vláken musí být schopen pracovat nezávisle na ostatních, aby byla umožněna škálovatelnost systému (na GPU s více jádry půjde spustit více bloků paralelně oproti GPU s méně jádry, kde bloky poběží v sérii).
Warp
Balík vláken zpracovávaných v jednom okamžiku se nazývá warp. Jeho velikost je závislá na počtu výpočetních jednotek.

Počet a organizace spuštěných vláken v jednom bloku a počet a organizace bloků v mřížce se určuje při volání kernelu.

Typický průběh GPGPU výpočtu

  1. Vyhrazení paměti na GPU
  2. Přesun dat z hlavní paměti RAM do paměti grafického akcelerátoru
  3. Spuštění výpočtu na grafické kartě
  4. Přesun výsledků z paměti grafické karty do hlavní RAM paměti

Ukázka kódu v CUDA C

Převzato z [2].

// Kód pro GPU
__global__ void VecAdd(float* A, float* B, float* C, int N)
{
 int i = blockDim.x * blockIdx.x + threadIdx.x;
 if (i < N)
 C[i] = A[i] + B[i];
}
// Kód pro CPU
int main()
{
 int N = ;
 size_t size = N * sizeof(float);
// Alokace vstupních vektorů h_A and h_B v hlavní paměti
 float* h_A = (float*)malloc(size);
 float* h_B = (float*)malloc(size);
// Inicializace vstupních vektorů
 
// Alokace paměti na zařízení
 float* d_A;
 cudaMalloc(&d_A, size);
 float* d_B;
 cudaMalloc(&d_B, size);
 float* d_C;
 cudaMalloc(&d_C, size);
// Přesun vektorů z hlavní paměti do paměti zařízení
 cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
 cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
// Volání kernelu
 int threadsPerBlock = 256;
 int blocksPerGrid = (N + threadsPerBlock  1) / threadsPerBlock;
 VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);
// Přesun výsledků z paměti zařízení do hlavní paměti
 cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
// Uvolnění paměti na zařízení
 cudaFree(d_A);
 cudaFree(d_B);
 cudaFree(d_C);
// Uvolnění hlavní paměti

Paměťový model

Hierarchie pamětí

Na grafické kartě je 6 druhů paměti, se kterými může programátor pracovat.

Pole registrů
je umístěno na jednotlivých stream multiprocesorech a jejich rozdělení mezi jednotlivé stream procesory plánuje překladač. Každé vlákno může přistupovat pouze ke svým registrům.
Lokální paměť
je užívána v případě, že dojde k vyčerpání registrů. Tato paměť je také přístupná pouze jednomu vláknu, je ale fyzicky umístěna v globální paměti akcelerátoru a tak je přístup k ní paradoxně pomalejší než např. ke sdílené paměti.
Sdílená paměť
je jedinou pamětí kromě registrů, která je umístěna přímo na čipu streaming multiprocesoru. Mohou k ní přistupovat všechna vlákna v daném bloku. Ke sdílené paměti se přistupuje přes brány zvané banky. Každý bank může zpřístupnit pouze jednu adresu v jednom taktu a v případě, že více streaming procesorů požaduje přístup přes stejný bank, dochází k paměťovým konfliktům, které se řeší prostým čekáním. Speciálním případem je situace, kdy všechna vlákna čtou ze stejné adresy a bank hodnotu zpřístupní v jednom taktu všem streaming procesorům pomocí broadcastu.
Globální paměť
je sdílená mezi všemi streaming multiprocesory a není ukládána do cache paměti.
Paměť konstant
je paměť pouze pro čtení, stejně jako globální paměť je sdílená s tím rozdílem, že je pro ni na čipu multiprocesoru vyhrazena L1 cache. Podobně jako sdílená paměť umožňuje rozesílání výsledku broadcastem.
Paměť textur
je také sdílená mezi SMP, určena pro čtení a disponuje cache pamětí. Je optimalizována pro 2D prostorovou lokalitu, takže vlákna ve stejném warpu, které čtou z blízkých texturovacích souřadnic dosahují nejlepšího výkonu.
Shrnutí vlastností pamětí
Typ paměti Umístění Uložení do cache Přístup Viditelnost Životnost
Registry Na čipu Ne Čtení/Zápis 1 vlákno Vlákno
Lokální Mimo čip Ne [pozn 1] Čtení/Zápis 1 vlákno Vlákno
Sdílená Na čipu Ne Čtení/Zápis Všechna vlákna v bloku Blok
Globální Mimo čip Ne [pozn 1] Čtení/Zápis Všechna vlákna a host Do uvolnění
Paměť konstant Mimo čip Ano Čtení Všechna vlákna a host Do uvolnění
Paměť textur Mimo čip Ano Čtení Všechna vlákna a host Do uvolnění
  1. a b Od compute capabilities 2.0 je ukládání do cache umožněno

Spolupráce s OpenGL a Direct3D

Některé prvky OpenGL a Direct3D mohou být mapovány do adresního prostoru CUDA aplikace, což umožňuje výměnu dat bez nutnosti jejich přenosu do hlavní paměti. Pro spolupráci s OpenGL lze mapovat OpenGL buffery, textury a renderbuffer objekty, pro spolupráci s Direct3D lze mapovat Direct3D buffery, textury a povrchy. Před samotným použitím v CUDA aplikaci je nutné nejprve prvek registrovat. Protože samotná registrace je výpočetně náročnou operací, je prováděna pouze jednou pro každý prvek. Registrované prvky lze poté podle potřeby přidávat a odebírat z adresního prostoru CUDA aplikace.

Přehled nástrojů pro debugging a profiling

Nedílnou součástí programování je profiling a debugging. Profiling je zvlášť důležitý pro optimalizaci velikosti bloků a počtu vláken, což má za následek lepší překrývání paměťových operací výpočtem.

Profilovací nástroje:

Nástroje pro debugging:

Externí odkazy

  • Logo Wikimedia Commons Obrázky, zvuky či videa k tématu CUDA na Wikimedia Commons
  1. CUDA Toolkit Documentation [online]. NVIDIA Developer. nVIDIA Corporation, rev. 2018-01-24 [cit. 2018-02-13]. Dostupné online. (anglicky) 
  2. a b CUDA Toolkit Documentation v9.1.85 [online]. NVIDIA Developer. nVIDIA Corporation, rev. 2018-01-24 [cit. 2018-02-13]. Dostupné online. (anglicky) 

Read other articles:

Aspect of world history The history of Anatolia (often referred to in historical sources as Asia Minor) can be roughly subdivided into: Prehistory of Anatolia (up to the end of the 3rd millennium BCE), Ancient Anatolia (including Hattian, Hittite and post-Hittite periods), Classical Anatolia (including Achaemenid, Hellenistic and Roman periods), Byzantine Anatolia (later overlapping, since the 11th century, with the gradual Seljuk and Ottoman conquest), Ottoman Anatolia (14th–20th centuries...

 

Buya HamkaSutradaraFajar BustomiProduser Frederica Chand Parwez Servia Ditulis oleh Alim Sudio Cassandra Massardi Pemeran Vino G. Bastian Laudya Cynthia Bella Penata musikPurwacarakaSinematograferIpung Rachmat SyaifulPenyuntingRyan PurwokoPerusahaanproduksi Falcon Pictures Starvision Majelis Ulama Indonesia Tanggal rilis 19 April 2023 (2023-04-19) (Indonesia, Vol. I) 17 Agustus 2023 (2023-08-17) (Netflix) Durasi106 menitNegaraIndonesiaBahasa Indonesia Minangkabau Arab ...

 

Garda Swiss Kepausanbahasa Latin: Pontificia Cohors Helveticabahasa Italia: Guardia Svizzera PontificiaJerman: Päpstliche Schweizergardecode: de is deprecated Prancis: Garde suisse pontificalebahasa Romansh: Guardia svizra papalaBendera Garda Swiss Kepausan dari Paus Fransiskus di bawah komando Christoph Graf (2015 hingga sekarang)[1]Aktif1506–15271548–17981800–18091814–sekarang[2]Negara  Kota Vatikan Negara Kepausan (1506–1870) AliansiSri PausT...

United States historic place in Yellowstone National Park United States historic placeFort YellowstoneU.S. National Register of Historic PlacesU.S. National Historic Landmark District Fort Yellowstone, circa 1910Fort Yellowstone mapLocationYellowstone National Park, Park County, Wyoming, United StatesNearest cityGardiner, MontanaCoordinates44°58′30″N 110°41′53″W / 44.97500°N 110.69806°W / 44.97500; -110.69806 (Fort Yellowstone)Built1891ArchitectUS A...

 

Street in Manhattan, New York 125 Worth Street Worth Street is a two-way street running roughly northwest-southeast in Manhattan, New York City. It runs from Hudson Street, TriBeCa, in the west to Chatham Square in Chinatown in the east. Past Chatham Square, the roadway continues as Oliver Street, a north-south street running one-way northbound. Between West Broadway and Church Street, Worth Street is also known as Justice John M. Harlan Way in honor of the Supreme Court justice and alumnus o...

 

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

Beberapa jenis lokomotif uap abad ke-20 menurut notasi Whyte serta dimensinya. Notasi Whyte seperti terlampir pada buku pedoman bagi para kru KA pada tahun 1906[1] Notasi Whyte adalah sistem klasifikasi lokomotif uap menurut susunan roda yang diciptakan oleh Frederick Methvan Whyte, dan mulai digunakan pada awal abad kedua puluh menyusul terbitnya editorial edisi Desember 1900 pada jurnal perkeretaapian American Engineer and Railroad Journal. Notasi Whyte menghitung jumlah roda muka, ...

 

Nepali Kshetri dynasty (1846–1951) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Rana dynasty – news · newspapers · books · scholar · JSTOR (September 2011) (Learn how and when to remove this message)Rana dynastyराणा वंशRanas of NepalParent familyKunwar familyCountryKingdom of NepalFounded1...

 

Town in New South Wales, AustraliaWombootaNew South WalesSchool of Arts hallWombootaCoordinates35°57′25″S 144°35′19″E / 35.95694°S 144.58861°E / -35.95694; 144.58861Population105 (2016 census)[1]Postcode(s)2731Elevation91 m (299 ft)Location 26 km (16 mi) from Moama 28 km (17 mi) from Bunnaloo LGA(s)Murray River CouncilCountyCadellState electorate(s)MurrayFederal division(s)Farrer Womboota is a locality in the cent...

Pour l’article homonyme, voir Jeux olympiques d'hiver de 1936. Jeux olympiques d'été de 1936 Localisation Pays hôte Allemagne Ville hôte Berlin Coordonnées 52° 30′ 58″ N, 13° 14′ 22″ E Date Du 1er au 16 août 1936 Ouverture officielle par Adolf HitlerChancelier d'Allemagne Participants Pays 49 Athlètes 3 967(3 632 masc. et 335 fém.) Compétition Nouveaux sports Basket-ball, canoë-kayak et Handball à onze Nombre de sports 19 Nombre ...

 

Sense tu Chanson de Jennifer auConcours Eurovision de la chanson 2006 Sortie 2006 Enregistré Ten Productions Studios, Sabadell Durée 3:00 Langue Catalan Genre Pop Auteur Joan Antoni Rechi Compositeur Rafael Artesero Herrero Producteur Xasqui Ten Label Música Global Discogràfica Classement 23e (8 points) Chansons représentant l'Andorre au Concours Eurovision de la chanson La mirada interior(2005) Salvem al món(2007)modifier Sense tu (en français Sans toi) est la chanson représent...

 

Church in Hampshire, EnglandSaint Mary's Church [1]Saint Mary's SouthamptonSaint Mary's Church from the southeast, showing the older tower and spire with the rebuilt body of the churchSaint Mary's Church [1]Shown within Southampton50°54′10″N 1°23′42″W / 50.90287°N 1.39506°W / 50.90287; -1.39506LocationSouthampton, Hampshire, EnglandDenominationChurch of EnglandChurchmanshipCharismatic evangelical AnglicanWebsitesaintmarys.churchHistoryStatu...

Organization of the United States Navy National Maritime Intelligence-Integration OfficeCountryUnited StatesBranchNavyGarrison/HQSuitland, MD, United StatesWebsitenmio.ise.govCommandersDirectorRear Admiral Michael A. Brookes, USNMilitary unit The National Maritime Intelligence-Integration Office (NMIO) is a United States Navy entity which promotes and facilitates intelligence sharing between the Navy and various federal, state, and local authorities, private companies, and foreign governments...

 

American mixed martial artist Curtis MillenderCurtis Milender at UFC 232 in Inglewood, California, United StatesBornCurtis Millender[1] (1987-12-01) December 1, 1987 (age 36)Anaheim, California, United StatesOther namesCurtiousNationalityAmericanHeight6 ft 2 in (1.88 m)Weight171 lb (78 kg; 12.2 st)DivisionWelterweightReach76 in (193 cm)Fighting out ofAnaheim, California, United StatesTeamNOC Fight TeamCSW (2016–present)[2] Team Bo...

 

Art museum in California , United StatesSan Jose Museum of Quilts & TextilesSJMQTEstablished1977Location520 S. First Street, San Jose, California 95113 United States TypeArt museumCollectionstextiles, fiber artsCollection size1,000DirectorKris Jensen (2023)Public transit accessSanta Clara station (VTA)San Jose Diridon stationWebsitesjquiltmuseum.org The San Jose Museum of Quilts & Textiles is an art museum in Downtown San Jose, California, USA.[1] Founded in 1977, the museum i...

American fraternal organization This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article contains wording that promotes the subject in a subjective manner without imparting real information. Please remove or replace such wording and instead of making proclamations about a subject's importance, use facts and attribution to demonstrate that importance. (December 2017) (Learn how and whe...

 

Sporting event delegationAustria at theOlympicsIOC codeAUTNOCAustrian Olympic CommitteeWebsitewww.olympia.at (in German)MedalsRanked 20th Gold 91 Silver 123 Bronze 132 Total 346 Summer appearances189619001904190819121920192419281932193619481952195619601964196819721976198019841988199219962000200420082012201620202024Winter appearances192419281932193619481952195619601964196819721976198019841988199219941998200220062010201420182022Other related appearances1906 Intercalated Games Austria has c...

 

Disambiguazione – Se stai cercando informazioni sui bombardamenti angloamericani su Berlino, vedi battaglia aerea di Berlino. Battaglia di Berlinoparte del fronte orientale della seconda guerra mondialeLa Bandiera della Vittoria sul Reichstag, celebre foto scattata da Evgenij Chaldej il 2 maggio 1945Data16 aprile - 2 maggio 1945 LuogoBerlino EsitoDecisiva vittoria sovietica Presa di Berlino Suicidio di Adolf Hitler Resa incondizionata della Germania Schieramenti Germania Unione S...

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article's tone or style may not reflect the encyclopedic tone used on Wikipedia. See Wikipedia's guide to writing better articles for suggestions. (April 2022) (Learn how and when to remove this message) This article may lend undue weight to very obscure AI projects of questionable importance. Please help improve it by rewriting it in ...

 

この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?: 松平頼胤 – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2019年11月)  凡例松平 頼胤 松平頼胤時代 江戸時代後期 - ...