Skoči na vsebino

Izvajalni model1

Grafične procesne enote z velikim številom procesnih elementov so idealne za pospeševanje problemov, ki so podatkovno paralelni. To so problemi, pri katerih se ista operacija izvaja nad velikim številom različnih podatkov. Tipični podatkovno paralelni problemi so računanje z velikimi vektorji/matrikami ali slikami, kjer isto operacijo izvajamo nad tisočami ali celo milijoni podatkov istočasno. Če želimo izrabiti tako masoven paralelizem, ki nam ga ponujajo GPE, moramo naše programe razdeliti v tisoče niti. Nit na GPE praviloma izvaja zaporedje operacij nad določenim podatkom (na primer enim elementom matrike), pri čemer je to zaporedje operacij največkrat neodvisno od enakih operacij, ki jih druge niti izvajajo nad drugimi podatki. Tako napisan program laho prenesemo na GPE, kjer bodo interni razvrščevalniki posrbeli za razvršanje niti po računskih enotah (CU) in procesnih elementih (PE). Angleški izraz za nit v terminologiji, ki se uporablja v OpenCL, je work-item.

Niti se na GPE razvrščajo v dveh korakih:

  • Programer mora eksplicitno znotraj programa posamezne niti razdeliti v delovne skupine (ang. work-groups). Niti v isti delovni skupini se bodo zagotovo izvajale na isti računski enoti. Ker imajo računske enote vgrajen lokalni pomnilnik, ki je dostopen vsem nitim na njej, si bodo le-te lahko hitro in enostavno izmenjevale podatke in pri tem ne bodo uporabljale počasnejšega globalnega pomnilnika GDDR5 na GPE. Poleg tega se lahko niti na isti računski enoti medseboj dokaj enostavno sinhronizirajo. Glavni razvrščevalnik na GPE bo delovne skupine enakomerno razvršal na vse računske enote. Delovne skupine se razvrščajo na računske enote popolnoma neodvisno ena od druge in v poljubnem vrstnem redu. Na eno računsko enoto se lahko v izvajanje pošlje več delovnih skupin (danes tipično največ 16).

  • Razvrščevalnik v računski enoti bo v izvajanje na procesne elemente pošiljal niti iz iste delovne skupine. Pri tem v vsakem ciklu v izvajanje pošlje natanko 32 niti. Tem nitim pravimo snop (ang. warp). Snop vedno vsebuje 32 zaporednih niti iz iste delovne skupine. Vse niti v snopu startajo na istem mestu v programu, vendar ima vsaka svoje registre, med njimi tudi programski števec. Tako lajko niti v snopu lahko poljubno vejijo, čeprav to ni zaželeno. Najboljšo učinkovitost pri izvajanju snopa dosežemo takrat, ko vse niti izvajajo isto zaporedje ukazov nad različnimi podatki (angl. lock-step execution). Če niti v snopu izvajajo skočne ukaze, pri čemer različno vejijo, se njihovo izvajanje serializira dokler vse spet ne pridejo na isti ukaz, kar močno zmanjša učinkovitost izvajanja. Zato moramo kot programerji paziti, da znotraj niti ni nepotrebnih vejitev (stavkov if-else). Izvajanje niti v snopih prikazuje spodnja slika.

Snopi

Število niti v eni delovni skupini je navzgor omejeno. Prav tako je omejeno število delovnih skupin, ki so hkrati dodeljene v izvajanje eni računski enoti, in število niti, ki so dedeljene eni računski enoti. Pri Tesla K40 je največje število niti v delovni skupini 1024, največje število delovnih skupin na eni računski enoti 16 in največje število niti, ki se lahko izvajajo na eni računski enoti, 2048. Iz zadnjega sledi, da se na eni računski enoti lahko izvaja največ 64 (2048/32) snopov.

Običajno v programih delamo manjše delovne skupine, ki vsebujejo 128 ali 256 niti. Na ta način lahko na računski enoti izvajamo več delovnih skupin (pri 256 nitih v skupini 8, pri 128 niti v delovni skupini 16 in pri 1024 nitih v delovni skupini 2) ter tako olajšamo delo razvrščevalniku, ki snope iz različnih delovnih skupin izvaja v poljubnem vrstnem redu. To pride prav posebej takrat, ko niti iz neke delovne skupine čakajo pred zaporo (se sinhronizirajo) in lahko razvrščevalnik v izvajanje pošlje snop niti iz neke druge delovne skupine.

Spodnja slika prikazuje računsko enoto v Tesla K40 GPE.

Kepler SMX

Vsaka računska enota ima štiri razvrščevalnike snopov (na sliki so označeni kot warp scheduler), zato se lahko v istem trenutku izvajajo štirje snopi. Poleg tega vsak razvrščevalnik snopov naenkrat v izvajanje izstavi dva ukaza (ima dve izstavitveni enoti, ang. dispatch unit) iz istega snopa niti, kar pomeni, da lahko naenkrat v izvajanje izstavi osem ukazov - naenkrat se tako zažene osem snopov. Na ta način so zagotovili, da so vse procesne enote ves čas zasedene. Dosedaj jih sicer nismo omenjali, a poleg 192 procesnih elementov vsebuje vsaka računska enota še 64 enot za računanje v plavajoči vejci z dvojno natančnostjo (ang. DP unit) ter 32 enot za specialne operacije, na primer trigonometirčne operacije (ang. SFU - Special Functions Unit). Spodnja slika prikazuje delovanje enega razvrščevalnika snopov.

Razvrščevalnik snopov

Vidimo, da se v vsakem trenutku izstavita dva ukaza iz istega snopa. Vrstni red izvajanja snopov je poljuben in je praviloma odvisen od pripravljenosti operandov.

Spodnja tabela povzema največje vrednosti posameznih parametrov v Tesla K40.

Omejitve v Tesla K40
Število niti v snopu 32
Največje število snopov v računski enoti 64
Največje število niti v računski enoti 2048
Največje število niti v skupini 1024
Največje število delovnih skupin v računski enoti 16
Največje število registrov za nit 255
Največja velikost lokalnega pomnilnika v računski enoti 48 kB

Dodatno branje:




  1. © Patricio Bulić, Univerza v Ljubljani, Fakulteta za računalništvo in informatiko. Gradivo je objavljeno pod licenco Creative Commons Priznanje avtorstva-Nekomercialno-Deljenje pod enakimi pogoji 4.0 Mednarodna