Ohjelmointi

SIMD Intrinsics eivät ole niin pelottavia, mutta pitäisikö meidän käyttää niitä?

Onko matalan tason ohjelmointi synti vai hyve? Se riippuu.

Kun ohjelmoin vektorikäsittelyä nykyaikaisella prosessorilla, kirjoitin mieluiten koodin suosikkikielelläni, ja se toimisi mahdollisimman nopeasti "automaattisesti".

Ellet aloittanut vasta viime viikolla ohjelmointia, epäilen, että tiedät, että maailma ei toimi näin. Huippusuorituskyky tulee vain vaivalla. Tästä syystä kysymykseni: kuinka matalalle meidän pitäisi mennä?

Vektoritoiminnot määritelty

"Vektori" -operaatio on matemaattinen operaatio, joka suorittaa useamman kuin yhden operaation. Vektorilisäys voi lisätä kahdeksan numeroparia tavallisen lisäyksen sijaan, mikä lisää vain yhden numeroparin. Harkitse tietokonetta lisäämään kaksi numeroa yhteen. Voimme tehdä sen säännöllisesti lisäämällä ohjeita. Harkitse tietokonetta pyytämään lisäämään kahdeksan numeroparia toisiinsa (laske C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). Voimme tehdä sen a vektori lisää ohje.

Vektori-ohjeet sisältävät yhteenlaskun, vähennyslaskun, kertolaskun ja muut toiminnot.

 SIMD: rinnakkaisuus vektorien suhteen

Tietokonetieteilijöillä on hieno nimi vektoriohjeille: SIMD tai “Single Instruction Multiple Data”. Jos ajattelemme säännöllistä lisäohjeita SISD: ksi (Single Instruction Single Data), missä yksittäinen tarkoittaa yhtä dataparien paria, sitten vektorilisä on SIMD, jossa useita voi tarkoittaa kahdeksaa paria tietopanoksia.

Haluan kutsua SIMD: tä "muuksi laitteiston rinnakkaiseksi", koska tietokoneiden "rinnakkaisuuden" ajatellaan olevan niin usein peräisin useista ytimistä. Ydinmäärät ovat kasvaneet tasaisesti. Neljän ytimen lukumäärä on yleinen, 20 tai enemmän on yleistä palvelinten prosessoreissa, ja Intelin ydinluku on tällä hetkellä 72 ydintä yhdessä Intel® Xeon Phi ™ -prosessorissa.

Myös vektoriohjeiden koot ovat nousseet. Varhaiset vektoriohjeet, kuten SSE, suorittivat jopa neljä operaatiota kerrallaan. Intelin suurin vektorileveys tänään AVX-512: ssä suorittaa jopa 16 toimintoa kerrallaan.

 Kuinka matalalle meidän pitäisi mennä?

Paljon suorituskyvyn ollessa vaakalaudalla, kuinka paljon työtä meidän tulisi tehdä tämän suorituskyvyn hyödyntämiseksi?

Vastaus on paljon, ja tästä syystä: Neljä ydintä voi nopeuttaa meitä enintään nelinkertaisesti. AVX (puolet AVX-512: n koosta, mutta paljon yleisempi) voi nopeuttaa meitä enintään 8 kertaa. Yhdessä ne voivat saada jopa 32x. Molempien tekeminen on paljon järkeä.

Tässä on yksinkertainen luetteloni siitä, miten yritetään hyödyntää vektoriohjeita (siinä järjestyksessä kuin meidän pitäisi yrittää soveltaa niitä):

 1.     Soita ensin kirjasto, joka tekee työn (lopullinen implisiittisessä vektoroinnissa). Esimerkki tällaisesta kirjastosta on Intel® Math Kernel Library (Intel® MKL). Joku muu teki kaiken työn vektoriohjeiden käyttämiseksi. Rajoitukset ovat ilmeisiä: Meidän on löydettävä kirjasto, joka tekee mitä tarvitsemme.

2.     Toiseksi, käytä implisiittistä vektorointia. Pysy abstraktina ja kirjoita se itse mallien tai kääntäjien avulla. Monilla kääntäjillä on vektorointikytkimet ja -vaihtoehdot. Kääntäjät ovat todennäköisesti kaikkein kannettavin ja vakain tapa edetä. Vektorointia varten on ollut monia malleja, mutta kukaan ei ole nähnyt tarpeeksi käyttöä ajan myötä selväksi voittajaksi (äskettäinen merkintä on Intel® SIMD Data Layout Templates [Intel® SDLT]).

3.     Kolmanneksi käytä nimenomaista vektorointia. Tästä on tullut erittäin suosittu viime vuosina, ja se yrittää ratkaista ongelman pysyä abstraktina mutta pakottaa kääntäjä käyttämään vektoriohjeita, kun se ei muuten käyttäisi niitä. SIMD: n tuki OpenMP: ssä on tässä avainesimerkki, jossa kääntäjän vektorointipyynnöt annetaan hyvin nimenomaisesti. Epätyypillisiä laajennuksia on monissa kääntäjissä, usein vaihtoehtojen tai "pragmojen" muodossa. Jos valitset tämän reitin, OpenMP on oikea tapa edetä, jos olet C-, C ++ - tai Fortran-alueella.

4.     Lopuksi päästä matalaksi ja likaiseksi. Käytä SIMD-sisäisiä ominaisuuksia. Se on kuin kokoonpanokieli, mutta kirjoitettu C / C ++ -ohjelman sisälle. SIMD: n sisäiset ominaisuudet näyttävät itse asiassa funktiokutsulta, mutta yleensä tuottavat yhden käskyn (vektoriopetusohje, joka tunnetaan myös nimellä SIMD-käsky).

SIMD: n luonteenpiirteet eivät ole pahoja; ne ovat kuitenkin viimeinen keino. Kolme ensimmäistä valintaa ovat aina ylläpidettävissä tulevaisuuden kannalta, kun ne toimivat. Kuitenkin, kun kolme ensimmäistä eivät täytä tarpeitamme, meidän on ehdottomasti yritettävä käyttää SIMD-luonnetta.

Jos haluat aloittaa SIMD-sisäisten ominaisuuksien käytön, sinulla on vakava jalka, jos olet tottunut kokoonpanokielen ohjelmointiin. Enimmäkseen tämä johtuu siitä, että sinulla on helpompaa lukea dokumentaatio, joka selittää toiminnot, mukaan lukien Intelin erinomainen online-sisäinen opas. Jos olet täysin uusi asia, törmäsin äskettäiseen blogiin ("SSE: ota huomioon aukko!"), Jolla on lempeä käsi sisäisen sisällön esittelyssä. Pidän myös ”Numeroiden murskaamisesta AVX: n ja AVX2: n kanssa”.

Jos kirjasto tai kääntäjä voi tehdä mitä tarvitset, SIMD-sisäiset ominaisuudet eivät ole paras valinta. Heillä on kuitenkin paikkansa, eikä niitä ole vaikea käyttää, kun totut niihin. Kokeile heitä. Suorituskykyedut voivat olla uskomattomia. Olen nähnyt älykkäiden ohjelmoijien käyttämiä SIMD-piirteitä koodiksi, jota kukaan kääntäjä ei todennäköisesti tuota.

Vaikka kokeilemme SIMD: n sisäisiä ominaisuuksia ja annamme lopulta kirjaston tai kääntäjän tehdä työn, oppimamme voi olla korvaamatonta ymmärtääksemme kirjaston tai kääntäjän parhaan käytön vektorointiin. Ja se voi olla paras syy kokeilla SIMD-luonnetta seuraavalla kerralla, kun tarvitsemme jotain vektori-ohjeiden käyttämiseen.

Napsauta tätä ja lataa ilmainen 30 päivän Intel Parallel Studio XE -kokeilujakso

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