SSE2, SSE3, SSE4, Microsofti kompilaatoriga

Streaming SIMD Extensions(SSE) on Inteli instruktsioonide arhitektuur, mis on käibel alates varasematest Pentium mudelitest. SIMD (single instruction multiple data) tähendab, et andmeid töödeldakse paralleelselt, ja kui samu instruktsioone kasutatakse suure hulga andmete peal, siis üldiselt kaasneb sellega ajavõit. Samas if-else stiilis kood üldiselt ei ole SIMD stiilis kirjutatav. Samuti on SSE kood aeganõudvam, sest enamasti kirjutatakse masinkoodi. Samas Microsoftil on c/c++ keelele loomuomased instruktsioonid(intrinsics).

Andmetüübid on 128 bitised ja neid saab laadida XMM[0-7] registritesse. Microsofti kompilaator lubab kasutada __asm plokke koos c koodiga(SSE2).
Kasutades Visual C++ kompilaatorit on SSE2 sarnane SSE3-e ja SSE4-ga.

Selles koodis liidetakse neli float tüüpi väärtust ja kasutatakse store operatsiooni, et andmed uuesti mällu laadida. a_dest[0] = a0 + a0, a_dest[1] = a1 + a1 jne. Kood on väga c lähedane ja ilma suurema vaevata arusaadav. Kiiruse võit on tuntav igal sammul, isegi int andmetüüpidega tegeledes. Kuid kõik tehted ei ole igal arhitektuuril saadavad(x86, x64, IPF). Näiteks SSE3 __mm_addsub_ps on sarnaselt kasutatav instruktsioon ja samuti IPF-i ei toeta.

#define  ALIGN16 __declspec(align(16))
void testIntrins()
{
__m128 dest;
float ALIGN16 s[4];
float ALIGN16 s2[4];
float * a;
float * a_dest;
s[0] = 1.1;s[1] = 2.2;s[2] = 3;s[3] = 4;
a = s;
a_dest = s2;
dest = _mm_add_ps(*(__m128 *)a,*(__m128 *)a);
_mm_store_ps(a_dest, dest);
printf("%f", a_dest[0]);
}

Advertisements