Programmēšana

SIMD būtība nav tik biedējoša, bet vai mums tās vajadzētu izmantot?

Vai zema līmeņa programmēšana ir grēks vai tikums? Tas ir atkarīgs no.

Programmējot vektoru apstrādi modernā procesorā, ideālā gadījumā es uzrakstītu kodu savā iecienītākajā valodā, un tas darbotos pēc iespējas ātrāk “automātiski”.

Ja vien jūs tikko sākāt programmēt pagājušajā nedēļā, man ir aizdomas, ka jūs zināt, ka pasaule darbojas nevis tā. Augstākā veiktspēja nāk tikai ar piepūli. Tāpēc mans jautājums: cik zemu mums vajadzētu iet?

Definētas vektoru darbības

“Vektors” ir matemātikas darbība, kas veic vairākas darbības. Vektora pievienošana var pievienot astoņus skaitļu pārus, nevis parasto pievienošanu, kas pievieno tikai vienu skaitļu pāri. Apsveriet iespēju lūgt datoru pievienot divus skaitļus kopā. Mēs to varam izdarīt ar regulāru pievienošanas instrukciju. Apsveriet iespēju lūgt datoru pievienot astoņus skaitļu pārus (aprēķiniet C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). Mēs to varam izdarīt ar vektors pievienot instrukciju.

Vektoru instrukcijas ietver saskaitīšanu, atņemšanu, reizināšanu un citas darbības.

 SIMD: paralēle vektoriem

Datorzinātniekiem vektora instrukcijām ir izdomāts nosaukums: SIMD vai “Single Instruction Multiple Data”. Ja mēs domājam par regulāru pievienošanas instrukciju kā SISD (Single Instruction Single Data) kur viens nozīmē vienu datu ievades pāri, tad vektoru pievienošana ir SIMD kur vairākkārtējs varētu nozīmēt astoņus datu ievades pārus.

Man patīk saukt SIMD par “citu aparatūras paralēlismu”, jo datoru “paralēlisms” tik bieži tiek uzskatīts par vairāku kodolu radīšanu. Galvenais skaits ir nepārtraukti palielinājies. Četru kodolu skaits ir izplatīts, serveru procesoros - 20 vai vairāk. Intel lielākais kodolu skaits šodien ir 72 kodoli vienā Intel® Xeon Phi ™ procesorā.

Arī vektoru instrukciju izmēri ir pieauguši. Agrīnās vektoru instrukcijas, piemēram, SSE, vienlaikus veica līdz četrām operācijām. Intel visaugstākais vektora platums šodien, AVX-512, vienlaikus veic līdz 16 operācijām.

 Cik zemu mums vajadzētu iet?

Cik daudz darba mums vajadzētu paveikt, lai izmantotu šo sniegumu, ņemot vērā tik lielo sniegumu?

Atbilde ir ļoti daudz, un šeit ir iemesls, kāpēc: četri kodoli var mums maksimāli paātrināt 4x. AVX (puse no AVX-512 lieluma, bet daudz biežāk) var mūs maksimāli paātrināt līdz 8x. Kopā viņi var sasniegt pat 32x. Darot abus, ir daudz jēgas.

Šeit ir mans vienkāršais saraksts ar to, kā mēģināt izmantot vektoru instrukcijas (tādā secībā, kādā mums tās jāmēģina pielietot):

 1.     Pirmkārt, izsauciet bibliotēku, kas veic šo darbu (vislielākā netiešā vektorizācija). Šādas bibliotēkas piemērs ir Intel® Math Kernel Library (Intel® MKL). Visu darbu, lai izmantotu vektoru instrukcijas, paveica kāds cits. Ierobežojumi ir acīmredzami: mums jāatrod bibliotēka, kas dara visu, kas mums vajadzīgs.

2.     Otrkārt, izmantojiet netiešu vektorizāciju. Esiet abstrakts un pats to uzrakstiet, izmantojot veidnes vai kompilatorus. Daudziem kompilatoriem ir vektorizācijas slēdži un opcijas. Kompilatori, visticamāk, ir vispārnēsājamākais un stabilākais ceļš. Vektorizācijai ir bijušas daudzas veidnes, taču neviena no tām nav pietiekami daudz lietojusi laika gaitā, lai būtu skaidrs uzvarētājs (nesenais ieraksts ir Intel® SIMD datu izkārtojuma veidnes [Intel® SDLT]).

3.     Treškārt, izmantojiet skaidru vektorizāciju. Pēdējos gados tas ir kļuvis ļoti populārs, un tas mēģina atrisināt problēmu, kā palikt abstraktam, bet liekot kompilatoram izmantot vektoru instrukcijas, ja tas tos citādi neizmantotu. SIMD atbalsts OpenMP ir galvenais piemērs šeit, kur kompilatora vektorizācijas pieprasījumi tiek sniegti ļoti skaidri. Nestandarta paplašinājumi pastāv daudzos kompilatoros, bieži opciju vai “pragmu” veidā. Ja izvēlaties šo maršrutu, OpenMP ir pareizais ceļš, ja atrodaties C, C ++ vai Fortran.

4.     Visbeidzot, nokļūstiet zemu un netīru. Izmantojiet iekšējo SIMD. Tā ir kā montāžas valoda, taču tā ir ierakstīta jūsu C / C ++ programmā. SIMD būtība faktiski izskatās kā funkciju izsaukums, bet parasti rada vienu instrukciju (vektoru darbības instrukciju, kas pazīstama arī kā SIMD instrukcija).

SIMD būtība nav ļauna; tomēr tie ir pēdējais līdzeklis. Pirmās trīs izvēles vienmēr ir labāk uzturamas nākotnei, kad tās darbojas. Tomēr, kad pirmie trīs nespēj apmierināt mūsu vajadzības, mums noteikti vajadzētu mēģināt izmantot SIMD iekšējo iedarbību.

Ja vēlaties sākt lietot SIMD iekšējo sistēmu, jums būs nopietni jāstrādā, ja esat pieradis pie montāžas valodas programmēšanas. Galvenokārt tas ir tāpēc, ka jums būs vieglāk lasīt dokumentāciju, kas izskaidro darbības, tostarp Intel lielisko tiešsaistes “iekšējo ceļvedi”. Ja jums tas ir pavisam jauns, es uzskrēju nesenā emuārā (“SSE: ņemiet vērā plaisu!”), Kuram ir maiga roka, ieviešot būtību. Man patīk arī “Skaitļošana ar AVX un AVX2”.

Ja bibliotēka vai kompilators var darīt visu, kas jums nepieciešams, SIMD iekšējie elementi nav labākā izvēle. Tomēr viņiem ir sava vieta, un, kad esat pieraduši, tos nav grūti izmantot. Izmēģiniet viņiem. Veiktspējas priekšrocības var būt pārsteidzošas. Esmu redzējis SIMD raksturīgo elementu, ko gudri programmētāji izmanto kodam, kuru, visticamāk, neražo neviens kompilators.

Pat ja mēs izmēģinām SIMD būtību un galu galā ļaujam bibliotēkai vai kompilatoram veikt darbu, uzzinātais var būt nenovērtējams, lai izprastu bibliotēkas vai kompilatora labāko izmantojumu vektorizācijai. Un tas var būt labākais iemesls, lai izmēģinātu SIMD iekšējo iedarbību nākamajā reizē, kad mums ir nepieciešams kaut kas, lai izmantotu vektoru instrukcijas.

Noklikšķiniet šeit, lai lejupielādētu bezmaksas Intel Parallel Studio XE 30 dienu izmēģinājumu

$config[zx-auto] not found$config[zx-overlay] not found