Assembly-kieli ja x86-tason järjestelmäohjelmointi · Oppitunti

SSE/AVX-käskyvalikoimien johdanto

Tutustukaa nykyaikaisiin SIMD-käskyvalikoimiin (SSE, AVX) ja niiden rekistereihin, jotka on suunniteltu rinnakkaiseen tietojenkäsittelyyn.

Oppitunti 2/411 vaihetta

SSE/AVX-käskyvalikoimien johdanto on ilmainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 2/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 Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Tervetuloa SIMD:n pariin!

Tässä oppitunnissa tutustumme rinnakkaiseen käsittelyyn suunniteltuihin tehokkaisiin käskyjoukkoihin: SSE ja AVX. Näiden laajennosten avulla CPU voi suorittaa saman operaation useille data-alkioille samanaikaisesti.

Tämä tekniikka, jota kutsutaan nimellä Single Instruction, Multiple Data (SIMD), on tärkeä esimerkiksi grafiikan hahmonnuksen, tieteellisten laskutoimitusten ja videonkäsittelyn nopeuttamisessa.

Skalaarinen ja vektorikäsittely

Kuvitellaan, että kaksi lukulistaa on laskettava yhteen. Perinteinen skalaariprosessori käsittelee yhden parin kerrallaan:

  • 1. luku + 1. luku
  • 2. luku + 2. luku
  • ...ja niin edelleen.

Vektoriprosessori (joka käyttää SIMD:iä) voi laskea useita pareja yhteen yhdellä käskyllä, mikä on suurilla aineistoilla huomattavasti nopeampaa.

SSE:n esittely

SSE on lyhenne sanoista Streaming SIMD Extensions. Intelin käyttöön ottama SSE toi x86-prosessoreihin 128-bittiset rekisterit ja käskyt.

Tämä tarkoittaa, että SSE-käsky voi käsitellä 128 bittiä dataa kerralla. Kertatarkkuuden liukuluvuilla (kukin 32 bittiä) voidaan näin käsitellä neljä lukua samanaikaisesti.

SSE-rekisterit: XMM0–XMM15

SSE käyttää 16 erillistä XMM-rekisteriä, jotka on nimetty XMM0–XMM15. Jokainen XMM-rekisteri on 128 bittiä leveä.

  • Niihin mahtuu neljä 32-bittistä kertatarkkuuden liukulukua.
  • Niihin mahtuu kaksi 64-bittistä kaksoistarkkuuden liukulukua.
  • Niihin mahtuu kuusitoista 8-bittistä kokonaislukua.

Nämä rekisterit ovat erillään yleiskäyttöisistä rekistereistä, kuten EAX- ja EBX-rekistereistä.

SSE-datan siirto: MOVAPS

Tarkastellaan SSE:n peruskäskyä MOVAPS. Tämä käsky siirtää kohdistettuja pakattuja kertatarkkuuden liukulukuja. Se lataa 128 bittiä dataa muistista XMM-rekisteriin.

Kokeile suorittaa tämä esimerkki (jossa käytetään NASM-syntaksia Linux x86-64:lle):

section .data
  ; Define 4 single-precision floats (128 bits total)
  my_sse_data dd 1.0, 2.0, 3.0, 4.0

section .text
  global _start

_start:
  ; Load 128 bits from my_sse_data into XMM0
  movaps xmm0, [my_sse_data]

  ; XMM0 now holds [1.0, 2.0, 3.0, 4.0]

  ; Exit the program (Linux x86/x64 syscall)
  mov eax, 1    ; sys_exit
  xor ebx, ebx  ; exit code 0
  int 0x80      ; Invoke kernel

SSE:n jälkeen: AVX

AVX eli Advanced Vector Extensions on SIMD-käsittelyn jatkokehitys. AVX laajentaa SIMD-rekisterit 256-bittisiksi, joten yhdellä käskyllä käsiteltävän datan määrä kaksinkertaistuu SSE:hen verrattuna.

AVX toi käyttöön myös uuden käskyjen koodausmenetelmän (VEX-etuliite) sekä tuhoamattomat operaatiot. Tämä tarkoittaa, että kohdereksiteri ei oletusarvoisesti korvaa lähderekistereitä.

AVX-rekisterit: YMM0–YMM15

AVX toi käyttöön 16 uutta YMM-rekisteriä (YMM0–YMM15). Jokainen YMM-rekisteri on 256 bittiä leveä.

  • YMM-rekisteriin mahtuu kahdeksan 32-bittistä kertatarkkuuden liukulukua.
  • Siihen mahtuu myös neljä 64-bittistä kaksoistarkkuuden liukulukua.

Jokaisen YMM-rekisterin alemmat 128 bittiä ovat päällekkäin vastaavan XMM-rekisterin kanssa. Esimerkiksi YMM0:n alempi puolisko on XMM0.

AVX-datan siirto: VMOVAPS

AVX:n vastine käskylle MOVAPS on VMOVAPS. V-etuliite ilmaisee VEX-koodatun AVX-käskyn. Tämä käsky siirtää kohdistettuja pakattuja kertatarkkuuden liukulukuja, mutta nyt 256 bittiä kerrallaan.

Tässä esimerkissä ladataan 8 liukulukua YMM-rekisteriin:

section .data
  ; Define 8 single-precision floats (256 bits total)
  my_avx_data dd 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0

section .text
  global _start

_start:
  ; Load 256 bits from my_avx_data into YMM0
  vmovaps ymm0, [my_avx_data]

  ; YMM0 now holds [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

  ; Exit the program (Linux x86/x64 syscall)
  mov eax, 1    ; sys_exit
  xor ebx, ebx  ; exit code 0
  int 0x80      ; Invoke kernel

Keskeiset erot: SSE ja AVX

Vaikka SSE ja AVX ovat molemmat SIMD-laajennoksia, AVX tarjoaa merkittäviä parannuksia:

  • Rekisterin koko: SSE käyttää 128-bittisiä XMM-rekistereitä, kun taas AVX käyttää 256-bittisiä YMM-rekistereitä.
  • Datan läpimeno: AVX voi käsitellä yhdellä käskyllä kaksi kertaa enemmän dataa kuin SSE.
  • Tuhoamattomat operaatiot: Monet AVX-käskyt tukevat kolmen operandin muotoa, jolloin lähdeoperandit säilyvät ennallaan.
  • VEX-etuliite: AVX-käskyissä käytetään VEX-etuliitettä, joka mahdollistaa joustavamman koodauksen ja tulevat laajennokset.

Pikatarkistus: SIMD-rekisterit

Mitkä seuraavista SSE- ja AVX-rekistereitä koskevista väitteistä ovat TOSIA?

Kertaus: SIMD:n teho

Tutustuimme SSE- ja AVX-käskyjoukkoihin, jotka ovat tehokkaita SIMD-laajennoksia ja joiden avulla CPU voi suorittaa operaatioita useille data-alkioille samanaikaisesti. Opit seuraavat asiat:

  • SIMD:n käsitteen ja sen hyödyt rinnakkaiskäsittelyssä.
  • SSE:n ja sen 128-bittiset XMM-rekisterit (XMM0-XMM15).
  • AVX:n ja sen 256-bittiset YMM-rekisterit (YMM0-YMM15).
  • Peruskomentoja datan siirtämiseen, kuten MOVAPS ja VMOVAPS.

Näiden käskyjoukkojen ymmärtäminen on tärkeää dataintensiivisten tehtävien suorituskyvyn optimoinnissa.

Aloita maksutta

Opi Assembly 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
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”SSE/AVX-käskyvalikoimien johdanto” ilmainen?

Kyllä – oppitunnin ”SSE/AVX-käskyvalikoimien johdanto” 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 Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssin, päivitä CoddyKit PROhon. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”SSE/AVX-käskyvalikoimien johdanto”?

Tutustukaa nykyaikaisiin SIMD-käskyvalikoimiin (SSE, AVX) ja niiden rekistereihin, jotka on suunniteltu rinnakkaiseen tietojenkäsittelyyn. Harjoittelet Assembly-kieli ja x86-tason järjestelmäohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Assembly-kieli ja x86-tason järjestelmäohjelmointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”SSE/AVX-käskyvalikoimien johdanto”-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ä Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunnilla?

Kyllä. Jokainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-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

  1. x87 FPU -ohjelmoinnin perusteet
  2. SSE/AVX-käskyvalikoimien johdanto
  3. Koodin vektorointi SIMD:n avulla
  4. Liukulukujen tarkkuus, pyöristys ja poikkeukset
← Takaisin: Assembly-kieli ja x86-tason järjestelmäohjelmointi