Programovanie

SIMD Intrinsics nie sú také strašidelné, ale mali by sme ich použiť?

Je programovanie na nízkej úrovni hriechom alebo cnosťou? Záleží.

Pri programovaní na použitie vektorového spracovania na modernom procesore by som ideálne napísal nejaký kód v mojom obľúbenom jazyku, ktorý by bežal čo najrýchlejšie „automaticky“.

Pokiaľ ste minulý týždeň nezačali programovať, myslím, že viete, že svet takto nefunguje. Špičkový výkon prichádza iba s námahou. Preto moja otázka: ako nízko by sme mali ísť?

Definované vektorové operácie

„Vektorová“ operácia je matematická operácia, ktorá vykonáva viac ako jednu operáciu. Pridanie vektora môže pridať osem párov čísel namiesto bežného pridania, ktoré pridá iba jeden pár čísel. Zvážte požiadavku, aby počítač spojil dve čísla. Môžeme to urobiť pravidelným pokynom na pridanie. Zvážte požiadanie počítača, aby si navzájom pridalo osem párov čísel (vypočítajte C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). Môžeme to urobiť pomocou a vektor pridať inštrukciu.

Vektorové pokyny zahŕňajú operácie sčítania, odčítania, násobenia a ďalšie operácie.

 SIMD: paralelizmus pre vektory

Počítačoví vedci majú vymyslený názov pre vektorové pokyny: SIMD alebo „Single Instruction Multiple Data“. Ak uvažujeme o bežnej inštrukcii na pridanie ako o SISD (Single Instruction Single Data), kde slobodný znamená jeden pár dátových vstupov, potom je vektorový prídavok SIMD kde viacnásobný môže znamenať osem párov dátových vstupov.

Rád nazývam SIMD „druhý hardvérový paralelizmus“, pretože „paralelizmus“ v počítačoch sa tak často považuje za pochádzajúci z viacerých jadier. Počty jadier sa neustále zvyšovali. Počty jadier štyri sú bežné, 20 alebo viac je bežných v procesoroch pre servery a najvyšší počet jadier spoločnosti Intel je dnes 72 jadier v jednom procesore Intel® Xeon Phi ™.

Vzrástla aj veľkosť vektorových inštrukcií. Skoré vektorové pokyny, ako napríklad SSE, vykonávali naraz až štyri operácie. Najvyššia vektorová šírka spoločnosti Intel v súčasnosti v AVX-512 vykonáva až 16 operácií súčasne.

 Ako nízko by sme mali ísť?

Koľko práce by sme mali urobiť, aby sme tento výkon využili, keď je v stávke toľko výkonu?

Odpoveď je veľa a je tu dôvod, prečo: Štyri jadrá nás môžu maximálne štvornásobne zrýchliť. AVX (polovičná veľkosť ako AVX-512, ale oveľa bežnejšia) nás môže dostať až na 8-násobné zrýchlenie. Dokopy ich môžu získať až 32-násobok. Robiť oboje má veľký zmysel.

Tu je môj jednoduchý zoznam spôsobov, ako sa pokúsiť využiť vektorové pokyny (v poradí, v akom by sme sa ich mali pokúsiť použiť):

 1.     Najskôr zavolajte knižnicu, ktorá vykonáva prácu (ultimátna implicitná vektorizácia). Príkladom takejto knižnice je Intel® Math Kernel Library (Intel® MKL). Všetku prácu s použitím vektorových pokynov vykonal niekto iný. Obmedzenia sú zrejmé: Musíme nájsť knižnicu, ktorá robí to, čo potrebujeme.

2.     Po druhé, použite implicitnú vektorizáciu. Buďte abstraktní a napíšte si to sami pomocou šablón alebo prekladačov, ktoré vám pomôžu. Mnoho prekladačov má prepínače a možnosti vektorizácie. Prekladače budú pravdepodobne najprenosnejším a najstabilnejším spôsobom, ako postupovať. Existuje mnoho šablón na vektorizáciu, ale žiadna z nich v priebehu času nezaznamenala dostatočné využitie na to, aby bola jasným víťazom (nedávny príspevok je Intel® SIMD Data Layout Templates [Intel® SDLT]).

3.     Po tretie, použite explicitnú vektorizáciu. Toto je v posledných rokoch veľmi populárne a snaží sa vyriešiť problém zachovania abstraktnosti, ale prinútiť kompilátor, aby používal vektorové inštrukcie, keď by ich inak nepoužíval. Kľúčovým príkladom je podpora SIMD v OpenMP, kde sú požiadavky na vektorizáciu pre kompilátor uvedené veľmi výslovne. Neštandardné rozšírenia existujú v mnohých kompilátoroch, často vo forme volieb alebo „pragiem“. Ak sa vydáte touto cestou, OpenMP je spôsob, ako ísť, ak sa nachádzate v jazykoch C, C ++ alebo Fortran.

4.     Nakoniec sa posaďte a zašpinte. Využite možnosti SIMD. Je to ako jazyk zhromaždenia, ale napísaný vo vašom programe C / C ++. Vnútorné znaky SIMD skutočne vyzerajú ako volanie funkcie, ale spravidla vytvárajú jednu inštrukciu (inštrukcia vektorovej operácie, známa tiež ako inštrukcia SIMD).

Vnútorné stránky SIMD nie sú zlé; sú však poslednou možnosťou. Prvé tri možnosti sú vždy vhodnejšie pre budúcnosť, keď budú fungovať. Keď však prvé tri nesplnia naše potreby, mali by sme sa určite pokúsiť použiť vnútorné riešenia SIMD.

Ak chcete začať používať základné funkcie SIMD, budete mať poriadnu nohu, ak ste zvyknutí na programovanie v jazykoch zhromažďovania. Väčšinou je to preto, že si ľahšie prečítate dokumentáciu, ktorá vysvetľuje operácie, vrátane vynikajúceho online sprievodcu Intel „Intrinsics Guide“. Ak ste v tom úplne nový, narazil som na nedávny blog („SSE: mind the gap!“), Ktorý má jemnú ruku pri zavádzaní podstatných vecí. Páči sa mi tiež „Crunching Numbers with AVX and AVX2.“

Ak knižnica alebo kompilátor dokáže všetko, čo potrebujete, vnútorná stránka SIMD nie je tou najlepšou voľbou. Majú však svoje miesto a nie je ťažké ich použiť, keď si na ne zvyknete. Vyskúšajte ich. Výhody výkonu môžu byť úžasné. Videl som, ako SIMD využívajú inherentné schopnosti šikovných programátorov pre kód, ktorý pravdepodobne žiadny kompilátor neprodukuje.

Aj keď vyskúšame vnútornú stránku SIMD a nakoniec necháme prácu na knižnici alebo kompilátore, to, čo sa naučíme, môže byť neoceniteľné pre pochopenie najlepšieho využitia knižnice alebo prekladača na vektorizáciu. A to môže byť najlepší dôvod na vyskúšanie vnútorných riešení SIMD, keď nabudúce budeme potrebovať niečo, aby sme mohli použiť vektorové pokyny.

Kliknite sem a stiahnite si bezplatnú 30-dňovú skúšobnú verziu Intel Parallel Studio XE

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