SSE eliStreaming SIMD Extensions (aluksi ISSE,engl.Internet Streaming SIMD Extension[1], myöhemminengl.Intel Streaming SIMD Extension[2] ) onIntelinSIMD-käskykantalaajennus (Single Instruction, Multiple Data; yksi käsky, paljon dataa)IA-32-käskykantaan. SSE tuli käyttöön vuonna 1999Pentium III -suorittimessa.
SSE lisää suorittimeen kahdeksan 128-bittistä rekisteriä (XMM0–XMM07) ja 70 kpl näitä käyttäviäkäskyjä. Käskykannasta löytyy mm. käskyjä joilla rekistereille voidaan laskea rinnakkain neljää 32-bittistäliukulukuoperaatiota.
SSE tehostaa erityisesti3D-grafiikan geometriamuunnosten laskemista. Laajennus tuplasi Pentium III:n liukulukusuorituskyvyn lisäten suorittimen ytimen pinta-alaa vain kymmenyksellä. Käskykannan avulla Pentium III pystyi reaaliaikaiseenMPEG-1 jaMPEG-2-videon purkuun ja soittamaanDVD-levyjä 30 ruutua sekunnissa siten että aikaa jäi vielä muillekin ohjelmille.[1]Surkuhupaisasti sitä mainostettiin alun perinInternetin käyttöä nopeuttavana laajennuksena, mistä alkuperäinen nimikin tulilähde?.
Koska käskykanta lisäsi suorittimen rekisterien määrää, tulee tämä huomioida tilanteissa, joissa suorittimen tila piti tallettaa, kuten esimerkiksi ohjelmasta toiseen vaihtaessa, joten SSE-käskyjen käyttö vaatii tukea alla olevaltakäyttöjärjestelmältä. Jotta ohjelmat eivät voisi yrittää käyttää SSE-käskyjä ilman sitä tukevaa käyttöjärjestelmää, mistä seuraisi ohjelmien virheellistä toimintaa, suorittimeen lisättiin uusi toimintatila. SSE-tietoinen käyttöjärjestelmä asettaa suorittimen tähän toimintatilaan, ja vasta tämän jälkeen SSE-käskyt ovat käytettävissä.
Ensimmäinen SSE-käskykantaa tukenut suoritin oliIntelinPentium III, joka julkaistiin alkuvuodesta 1999.AMD oli vajaata vuotta aikaisemmin julkaissut oman3DNow!-käskykantansaK6-2-suorittimen myötä. 3DNow! puolestaan oli "oikein tehty" korvaaja Intelin alkuperäiselleMMX-käskylaajennukselle, joka ei osannut käsitellä kuin kokonaislukuja, ja sitä käytettäessä esti suorittimen liukulukumatematiikan käytön. SSE ja 3DNow! olivat keskenään kilpailevia käskykantalaajennoksia, ja ajan myötä SSE vei voiton mm. Intelin suuremman markkina-aseman ja paremmankääntäjätuen ansiosta, ja nykyisin ohjelmat optimoidaan tyypillisesti käyttämään SSE-käskyjä mutta ei 3DNow!-käskyjä. AMD otti SSE-käskykannan käyttöönAthlon XP-suorittimessaan vuonna 2001. SSE-käskykantaa on myöhemmin laajennettuSSE2-käskyillä.
SSE-komentoja voidaan käyttää erikseenassembly-ohjelmilla taiinline komennoilla ylemmän tason kielestä kutenC- taiC++-kielestä.[3]
Triviaali esimerkki kahdenvektorin yhteenlaskemisesta SSE-komentoja käyttäen C++-kielisestä ohjelmasta (inline-assembly):
structvec_t{floatv[4];};vec_tv1={1.1,1.2,1.3,1.4};vec_tv2={1.2,2.2,3.2,4.2};vec_tvec_res={0.0,0.0,0.0,0.0};__asm{movapsxmm0,[v1];v1arvotlähteestärekisteriinaddpsxmm0,[v2];v1+v2(alkioidensummat)movaps[vec_res],xmm0;kopiorekisteristäkohdemuuttujaan}
Kääntäjien mukana on tyypillisestiintrinsicsstandardifunktiot suoritinkohtaisten alemman tason operaatioiden käyttämiseen ilman inline-assemblya. Esimerkiksi Microsoftin kääntäjä toteuttaa standardifunktiot, jotka vastaavat suoraanx86-käskykannan laajennuksia.[4] Samoin tekevät myös mm. Intelin C/C++ kääntäjä jaGCC.[5]
Suoritin odottaa, että muuttujattasataan (engl.align) tiettyyn kokoon, joka SSE-komennoilla tarkoittaa 16-tavuista (128-bittistä) tasausta. Koskafloat
on tyypillisesti neljä tavua tämä tapahtuu automaattisesti neljän muuttujantaulukolla (engl.array). Muuttujatyypille tasaus asetetaan__declspec
määrittelyllä seuraavasti:[6]
__declspec(align(16))structvec_t{floatv[4];};
Koska kyseessä on käskylaajennus tavalliseen käskykantaan normaalisti tarkistettava että suoritin tukee laajennusta.[7]