Programiranje

SIMD Intrinsics niso tako strašljivi, a naj jih uporabimo?

Je programiranje na nizki ravni greh ali vrlina? Odvisno.

Ko bi programiral za uporabo vektorske obdelave na sodobnem procesorju, bi v idealnem primeru napisal nekaj kode v svojem najljubšem jeziku in bi tekel čim hitreje "samodejno čarobno".

Če šele prejšnji teden niste začeli programirati, sumim, da veste, da svet ne deluje tako. Vrhunska zmogljivost prihaja le z naporom. Od tod tudi moje vprašanje: kako nizko naj gremo?

Določene so vektorske operacije

"Vektorska" operacija je matematična operacija, ki opravi več kot eno operacijo. Vektorski dodatek lahko doda osem parov števil namesto običajnega seštevka, ki doda samo en par števil. Razmislite o tem, da bi računalnik prosil, naj sešteje dve številki. To lahko storimo z rednim navodilom za dodajanje. Razmislite o tem, da bi računalnik prosil, naj med seboj doda osem parov števil (izračunajte C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). To lahko storimo z a vektor dodajte navodila.

Vektorska navodila vključujejo seštevanje, odštevanje, množenje in druge operacije.

 SIMD: vzporednost vektorjev

Računalniki imajo modno ime za vektorska navodila: SIMD ali »Single Instruction Multiple Data«. Če mislimo na redno navodilo za dodajanje kot na SISD (Single Instruction Single Data), kjer samski pomeni en par podatkovnih vhodov, potem je vektorski dodatek SIMD, kjer večkraten lahko pomeni osem parov vnosov podatkov.

SIMD rad imenujem "drugi vzporednost strojne opreme", saj za "vzporednost" v računalnikih tako pogosto mislijo, da izvira iz več jeder. Število jeder se je nenehno povečevalo. Število štirih jeder je pogosto, 20 ali več pogostih v procesorjih za strežnike, Intelovo največje število jeder pa je danes 72 jeder v enem procesorju Intel® Xeon Phi ™.

Tudi velikosti vektorskih navodil so se povečale. Zgodnja vektorska navodila, kot je SSE, so izvedla do štiri operacije hkrati. Intelova največja vektorska širina danes, v AVX-512, hkrati izvede do 16 operacij.

 Kako nizko naj gremo?

Kako veliko dela bi morali izkoristiti, če gre za toliko uspešnosti?

Odgovor je velik, zato pa še: zakaj lahko štiri jedra pospešijo največ 4-krat. AVX (polovico manjši od AVX-512, vendar veliko pogostejši) nam lahko omogoči največ 8-kratno pospešitev. V kombinaciji lahko dosežejo do 32X. Če delamo oboje, je to zelo smiselno.

Tu je moj preprost seznam, kako poskusiti izkoristiti vektorska navodila (v vrstnem redu, v katerem jih moramo poskusiti uporabiti):

 1.     Najprej pokličite knjižnico, ki opravlja delo (končna implicitna vektorizacija). Primer take knjižnice je Intel® Math Kernel Library (Intel® MKL). Vsa dela za uporabo vektorskih navodil je opravil nekdo drug. Omejitve so očitne: poiskati moramo knjižnico, ki dela tisto, kar potrebujemo.

2.     Drugič, uporabite implicitno vektorizacijo. Ostanite abstraktni in si ga zapišite v predloge ali prevajalnike. Mnogi prevajalniki imajo stikala in možnosti vektorizacije. Prevajalniki so verjetno najbolj prenosna in stabilna pot. Obstajalo je veliko predlog za vektorizacijo, vendar nobena sčasoma ni videla dovolj uporabe, da bi bila očitna zmagovalka (nedavni prispevek je Intel® SIMD Data Layout Templates [Intel® SDLT]).

3.     Tretjič, uporabite eksplicitno vektorizacijo. To je v zadnjih letih postalo zelo priljubljeno in poskuša rešiti problem, da ostane abstrakten, vendar prisili prevajalnik, da uporablja vektorska navodila, kadar jih drugače ne bi uporabil. Podpora za SIMD v OpenMP je tukaj ključni primer, kjer so zahteve za vektorizacijo za prevajalnik podane zelo eksplicitno. V mnogih prevajalnikih obstajajo nestandardne razširitve, pogosto v obliki možnosti ali "pragme". Če se odločite za to pot, je OpenMP prava pot, če uporabljate C, C ++ ali Fortran.

4.     Končno, postanite nizki in umazani. Uporabite SIMD intrinsics. Je kot montažni jezik, vendar zapisan znotraj vašega programa C / C ++. Lastnosti SIMD dejansko izgledajo kot klic funkcije, vendar na splošno ustvarijo eno navodilo (vektorsko navodilo za uporabo, znano tudi kot navodilo SIMD).

Lastnosti SIMD niso zlobne; vendar so v skrajnem primeru. Prve tri možnosti so vedno bolj vzdržne za prihodnost, ko delujejo. Kadar pa prvi trije ne ustrezajo našim potrebam, moramo vsekakor poskusiti uporabiti intrinzike SIMD.

Če želite začeti uporabljati SIMD intrinsics, boste imeli resno nogo, če ste vajeni programiranja v zbirnem jeziku. Večinoma je to zato, ker boste lažje brali dokumentacijo, ki pojasnjuje delovanje, vključno z odličnim Intelovim spletnim vodnikom za intrinziko. Če ste v tem povsem novi, sem naletel na nedavni spletni dnevnik (»SSE: upoštevaj vrzel!«), Ki ima nežno roko pri uvajanju intrinzike. Všeč mi je tudi »drobljenje številk z AVX in AVX2.«

Če lahko knjižnica ali prevajalnik stori tisto, kar potrebujete, lastnost SIMD ni najboljša izbira. Vendar imajo svoje mesto in jih ni težko uporabiti, ko se jih navadiš. Preizkusite jih. Prednosti delovanja so lahko neverjetne. Videl sem intrinzike SIMD, ki jih pametni programerji uporabljajo za kodo, ki je verjetno ne bo ustvaril noben prevajalnik.

Tudi če preizkusimo lastne lastnosti SIMD in sčasoma pustimo, da delo opravi knjižnica ali prevajalnik, je tisto, kar se naučimo, lahko neprecenljivo za razumevanje najboljše uporabe knjižnice ali prevajalnika za vektorizacijo. In to je morda najboljši razlog za preizkus intrinzike SIMD, ko bomo naslednjič potrebovali nekaj za uporabo vektorskih navodil.

Kliknite tukaj, če želite prenesti brezplačno 30-dnevno preskusno različico Intel Parallel Studio XE

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