Käskytason rinnakkaisuus
Anna kullekin säikeelle enemmän toisistaan riippumatonta työtä.
Käskytason rinnakkaisuus on ilmainen CUDA Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu CUDA Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. CUDA Academy-kurssilla on yhteensä 4 oppituntia.
Useampi asia samanaikaisesti
Yhden threadin sisällä GPU voi pitää useita toisistaan riippumattomia käskyjä suorituksessa samanaikaisesti. Tätä limitystä kutsutaan instruction-level parallelism -rinnakkaisuudeksi eli ILP:ksi.
Miksi ILP on tärkeää
Muisti- ja laskentaoperaatioiden valmistuminen kestää useita syklejä. Kun threadilla on riittävästi toisistaan riippumatonta työtä, laitteisto piilottaa tämän latency-viiveen sen sijaan, että jäisi odottamaan.
Riippuvuudet estävät limityksen
Jos jokainen rivi tarvitsee edellisen rivin tuloksen, mitään ei voida limittää. Pitkä dependency chain pakottaa threadin odottamaan vaihe vaiheelta.
float a = x * 2.0f;
float b = a + 1.0f; // waits on a
float c = b * b; // waits on bRiippumaton työ etenee vapaasti
Kun operaatiot eivät riipu toisistaan, scheduler voi antaa niitä suoritukseen peräkkäin. Ketjujen jakaminen independent-osiin on ILP:n ydin.
float a = x * 2.0f;
float b = y * 2.0f; // does not need aYksi thread, monta alkiota
Helppo tapa lisätä ILP:tä on antaa kunkin threadin käsitellä useita alkioita. Erilliset summat muodostavat independent-työtä, jota laitteisto voi limittää.
out[i] = in[i] + 1.0f;
out[i + n] = in[i + n] + 1.0f;Käyttäkää useita akkumulaattoreita
Yhteen muuttujaan summaaminen muodostaa ketjun. Työn jakaminen useille accumulators-akkumulaattoreille sallii riippumattomien yhteenlaskujen suorittamisen rinnakkain ennen niiden yhdistämistä.
float s0 = 0, s1 = 0;
s0 += a[i];
s1 += a[i + 1];Yhdistäkää lopuksi
Loopin jälkeen yhdistäkää osittaiset accumulators-akkumulaattorit lopulliseksi vastaukseksi. Yksi riippuvuus toteutuu nyt kerran eikä jokaisella iteraatiolla.
float total = s0 + s1;ILP vaihtaa rekistereihin
Useampien arvojen säilyttäminen threadia kohden käyttää enemmän registers-rekistereitä. Pieni lisäpaine rekistereille on yleensä piilotetun viiveen arvoista, mutta varmistakaa, ettei arvoja siirretä muistiin.
Kaksi tapaa piilottaa viive
GPU:t piilottavat odotuksia monien aktiivisten threadien avulla sekä kunkin threadin sisäisellä ILP:llä. Vahva ILP voi pitää SM:n kiireisenä, vaikka occupancy olisi vaatimaton.
Etsikää pitkät ketjut
Lisätäksenne ILP:tä etsikää sisemmän loopin pisin dependency chain. Rakenteen muuttaminen lyhyemmiksi, toisistaan riippumattomiksi osiksi paljastaa enemmän rinnakkaisuutta.
Älkää liioitelko
Liian monet toisistaan riippumattomat arvot voivat aiheuttaa rekisterien siirtoja muistiin ja hidastaa suoritusta. Säätäkää ILP:tä vähitellen ja antakaa profiler-profiloijan varmistaa jokaisen vaiheen hyöty.
Pikatarkistus
Reduktionne summaa yhteen muuttujaan jokaisella iteraatiolla. Miten lisäätte ILP:tä?
Kertaus: limitys threadin sisällä
Näitte, että ILP piilottaa viivettä suorittamalla toisistaan riippumattomia käskyjä yhdessä. Katkaiskaa riippuvuusketjut ja käyttäkää useita akkumulattoreita, mutta huomioikaa rekisteripaine. 🚀
Opi C++ tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Käskytason rinnakkaisuus” ilmainen?
Kyllä – oppitunnin ”Käskytason rinnakkaisuus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko CUDA Academy-kurssin, päivitä CoddyKit PROhon. CUDA Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Käskytason rinnakkaisuus”?
Anna kullekin säikeelle enemmän toisistaan riippumatonta työtä. Harjoittelet CUDA Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni CUDA Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin CUDA Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Käskytason rinnakkaisuus”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä CUDA Academy-oppitunnilla?
Kyllä. Jokainen CUDA Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Käskytason rinnakkaisuus
- Silmukan avaus komennolla #pragma unroll
- Vektoroidut lataukset float4:llä
- Rekisteripaine ja spillaukset