Druhá generace Parallel Thread Execution ISA
Kapitoly článků
Fermi je první architekturou podporující instrukční sadu Parallel Thread eXecution (PTX) 2.0. PTX je low level virtuální mašina a ISA (Instruction Set Architecture) navržená k podpoře paralelních operací na paralelních thread procesorech. PTX instrukce programů jsou ovladačem GPU překládány na strojové instrukce. Primárním cílem PTX je:
- poskytnou stabilní ISA, které přežije několik generací GPU
- dosahovat maximálního výkonu GPU v kompilovaných aplikacích
- poskytovat nezávislé ISA pro C, C++, Fortran a další jazyky
- poskytovat code distribution ISA pro vývojáře aplikací a middleware
- poskytovat společné ISA pro generátory a překladače optimalizovaného kódu pro jednotlivé jazyky
- usnadnit ruční psaní knihoven a výkonných kernelů
- poskytovat šklávoatelný programovací model, který se přizpůsobí velikosti GPU od několika jader až po mnoho paralelních jader
PTX 2.0 přináší několik nových vlastností, které velmi vylepšují programovatelnost GPU, přesnost výpočtů a výkon. To zahrnuje již zmiňované 32bit floating point přesnost, unifikované adresní prostory pro proměnné a ukazatele a nové instrukce pro OpenCL a DirectCompute. Speciálně zdůrazněme: PTX 2.0 bylo specificky navrženo k poskytnutí plné podpory pro programovací jazyk C++.
Jednotný adresní prostor pro plnou podporu C++
Fermi a PTX 2.0 ISA implementují jednotný (sjednocený, unifikovaný) adresní prostor, který sjednocuje tři až dosud oddělené adresní prostory (threadový lokální privátní, blokový sdílený a globální) pro načítání a uchovávání operací. V PTX 1.0 byly instrukce pro tyto operace specifické vždy pro jeden z oněch tří adresních prostorů. Programy mohly načítat a ukládat hodnoty pouze vždy v jednom daném specifickém, známém v momentě kompilace. Bylo tak velmi těžké plně implementovat C a C++ ukazatele, neboť cíle ukazatelů v adresním prostoru nemusely být v momentě kompilace známy a bylo možné je určovát pouze dynamicky za běhu.
S PTX 2.0 jednotný adresní prostor tyto dosud oddělené sjednocuje v jeden souvislý adresní prostor. Jediná sada unifikovaných instrukcí pro načítání a ukládání tak operuje nad tímto jediným adresním prostorem a nahrazuje onu dosud užívanou trojici pro lokální, sdílené a globální prostory. Aktuálně zadefinovaný 40bitový adresní prostor podporuje až 1 TB adresovatelné paměti, ISA pro načítání a ukládání podporuje dokonce 64bitové adresování pro budoucí růst parametrů produktů na bázi Fermi architektury.
I díky tto sjednocené implementaci podporuje Fermi plnohodnotně C++ programy. PTX 2.0 umožňuje použít unifikované ukazatele na kteroukoli oblast paměti, hardwarová translační jednotka Fermi pak automaticky mapuje ukazatele na správnou oblast paměti. Dále nechybí podpora pro virtuální funkce, ukazatele na funkci a "new" a "delete" operátory pro dynamickou alokaci objektů a dealokaci. Též jsou podporovány operace pro výjimky "try" a "catch".
Optimalizace pro OpenCL a DirectCompute
Jak OpenCL, tak DirectCompute je úzce spojeno s programovacím modelem CUDA. Mají shodné klíčové abstrakce threadů, bloky threadů, sítě bloků threadů, synchronizační paměťovou bariéru, perblock sdílenou paměť, globální paměť i atomické operace (takové, které jsou dokončovány "na jeden zátah" bez vlivu okolí uprostřed jejich běhu - nemůže se tedy stát, že by nějaké vlákno vyčetlo nekonzistentní data). Fermi jakožto třetí generace CUDA architektur, je "od přírody" pro tato API optimalizováno. Navíc Fermi disponuje hardwarovou podporou pro OpenCL a DierctCompute surface instrukce s konverzí formátu, což umožňuje grafickým a výpočetním programům jednoduše pracovat s těmi samými daty. PTX 2.0 ISA také přidává podporu pro další DirectCompute instrukce jako population count, append a bit-reverse.
IEEE 32bit Floating Point přesnost
Single-precision floating point instrukce nyní podporují subnormální čísla přímo na úrovni hardware, stejně jako zaokrouhlovací módy IEEE 754-2008 (nearest, zero, positive infinity,
a negative infinity). Subnormální čísla jsou taková, která leží mezi nejmenším pozitivním a největším negativním číslem každého floating point systému. Pryč je tak chování předchozí generace, která takové výsledky vypouštěla a dávala hodnoty jako nula, což vedlo ke ztrátě přesnosti výpočtu a produkovalo neodpovídající chování programů.
CPU typicky provádějí subnormální výpočty pomocí nakládání s výjimkami, což vyžaduje tisíce cyklů. FPU jednotka ve Fermi má na toto specifický kousek hardware, tedy vše provede bez dopadu na výkon.
Obvyklá sekvence operací v počítačové grafice či lineární algebře, je násobení dvou čísel a přičtení výsledku ke třetímu (tedy D = A . B + C). Předchozí generace GPU tuto funkci akcelerovaly multiply-add (MAD) instrukcí, která umožňovala vykonat oba operátory v jediném taktu. MAD instrukce provádí násobení s oříznutím následované přičítáním se zaokrouhlením na nejbližší hodnotu. Fermi implementuje novou fused multiply-add (FMA) instrukci v 32bit single-precision i 64bit double-precision floating point číslech (GT200 podporuje FMA jen pro double-precision).