Кіріспе
Intel SIMD процессорларына арналған қосымша нұсқаулар жиынтығы Intel SSE2 (Streaming SIMD Extensions 2) – Intel SIMD (Single Instruction, Multiple Data) процессорларына арналған қосымша нұсқаулар жиынтығының бірі. Intel компаниясы оны 2000 жылы Pentium 4 процессорларының алғашқы нұсқасымен бірге енгізді. SSE2 нұсқаулары x86 нұсқаулар жиынтығы архитектурасындағы процессорларда XMM (SIMD) регистрлерін пайдалануға мүмкіндік береді. Бұл регистрлер 128 бит көлеміндегі деректерді жүктей алады және векторлық қосу, көбейту сияқты нұсқауларды бір уақытта орындай алады. SSE2, SSE нұсқауларындағы бірлік дәлдіктегі қалқымалы нүктелік және бүтін сан нұсқауларына қоса, екілік дәлдіктегі қалқымалы нүктелік нұсқауларды да қосты. SSE2 бұрынғы SSE нұсқаулар жиынтығын 70 нұсқауға 144 жаңа нұсқау қосып кеңейтеді. SSE2 IA 32 архитектурасындағы процессорларда қолданылатын MMX SIMD нұсқаулар жиынтығын толықтай алмастыруды мақсат етеді. Бәсекелес чип өндіруші AMD 2003 жылы AMD64 64 биттік процессорларының Opteron және Athlon 64 серияларын шығару арқылы SSE2 қолдауын қосты. SSE2 2004 жылы SSE3 нұсқауларын жасау үшін, ал 2006 жылы SSE4 нұсқауларын жасау үшін тағы да кеңейтілді.
SSE2 (Streaming SIMD Extensions 2) is one of the Intel SIMD (Single Instruction, Multiple Data) processor supplementary instruction sets introduced by Intel with the initial version of the Pentium 4 in 2000. SSE2 instructions allow the use of XMM (SIMD) registers on x86 instruction set architecture processors. These registers can load up to 128 bits of data and perform instructions, such as vector addition and multiplication, simultaneously. SSE2 introduced double precision floating point instructions in addition to the single precision floating point and integer instructions found in SSE. SSE2 extends earlier SSE instruction set by adding 144 new instructions to the previous 70 instructions. SSE2 intends to fully replace MMX, a SIMD instruction set found on IA 32 architecture processors. Competing chip maker AMD added support for SSE2 with the introduction of their Opteron and Athlon 64 ranges of AMD64 64 bit CPUs in 2003. SSE2 was extended to create SSE3 in 2004, and extended once again to create SSE4 in 2006.
Ерекшеліктері
SSE2 нұсқауларының көп бөлігі MMX-те де кездесетін бүтін сандық векторлық операцияларды жүзеге асырады. MMX тіркелімдерінің орнына олар XMM тіркелімдерін пайдаланады, олар кеңірек және арнайы қолданбаларда өнімділіктің айтарлықтай артуына мүмкіндік береді. MMX-ті SSE2-мен алмастырудың тағы бір артықшылығы – MMX-те x87 нұсқауларын орындау кезіндегі режим ауыстыру салдарынан туындайтын кешігуден құтылу, себебі ол x87 FPU-мен тіркелімдік кеңістікті бөліседі. SSE2, сондай-ақ, SSE нұсқаулар жиынтығының қозғалатын нүктелік векторлық операцияларын қос дәлдікті дерек типін қолдау арқылы толықтырады. SSE2 кеңейтімдеріне шексіз ақпарат ағынын өңдеу кезінде кэштің ластануын азайтуға бағытталған кэштік басқару нұсқаулары жиынтығы және сандық форматтарды түрлендіруге арналған кеңейтілген нұсқаулар кіреді. AMD-нің AMD64 (x86 64) платформасындағы SSE2 іске асыруы қосымша сегіз тіркелімді қамтиды, осылайша тіркелімдердің жалпы саны 16-ға (XMM0-ден XMM15-ке дейін) еселейді. Бұл қосымша тіркелімдер тек 64 биттік режимде жұмыс істегенде ғана көрінеді. Intel 2004 жылы x86 64 архитектурасын (немесе Intel терминологиясында "Intel 64") қолдауының бір бөлігі ретінде осы қосымша тіркелімдерді қабылдады.
x87 FPU мен SSE2 арасындағы айырмашылықтар
FPU (x87) нұсқаулары аралық нәтижелерді 80 биттік дәлдікпен есептеу арқылы жоғары дәлдікті қамтамасыз етеді, сандық тұрақсыз алгоритмдердегі дөңгелектеу қатесін азайту үшін (IEEE 754 жобалау негіздемесін және ондағы сілтемелерді қараңыз). Дегенмен, x87 FPU – тек скалярлық құрылғы, ал SSE2 операндардың шағын векторын параллель өңдей алады. Егер x87 үшін жазылған код төмен дәлдікті екі дәлдікті SSE2 қозғалатын нүктесіне көшірілсе, математикалық операциялардың немесе кіріс деректер жиынтығының кейбір комбинациялары байқалатын сандық ауытқуларға алып келуі мүмкін, бұл қайталанатын ғылыми есептеулерде проблема тудыруы мүмкін, мысалы, егер есептеу нәтижелерін басқа машина архитектурасынан алынған нәтижелермен салыстыру қажет болса. Сонымен қатар, тарихи тұрғыдан алғанда, тіл стандарттары мен компиляторлар x87 80 биттік регистрлерді, екі есе кеңейтілген дәлдікті өзгергіштерді іске асыруда, SSE2-де іске асырылған екі және бір дәлдікті форматтармен салыстырғанда, үйлесімсіздіктер көрсетті: кеңейтілген дәлдіктегі аралық мәндерді екі есе дәлдікті өзгергіштерге дөңгелектеу толыққанды анықталмаған және регистрлер жадқа құйылған кездегідей, іске асыру егжей-тегжейлеріне байланысты болды.
MMX және SSE2 арасындағы айырмашылықтар
SSE2 MMX нұсқауларын XMM регистрлерінде жұмыс істеуге кеңейтеді. Сондықтан, барлық қолданыстағы MMX кодтарын SSE2 эквивалентіне түрлендіруге болады. SSE2 регистрі MMX регистрінен екі есе ұзын болғандықтан, циклдық тіркеуіштер мен жадқа қол жеткізуді осыған сәйкес өзгерту қажет болуы мүмкін. Дегенмен, XMM-ге 8 байттық жүктемелер мен сақтаулар қол жетімді, сондықтан бұл міндетті емес. Бір SSE2 нұсқаулы MMX нұсқаулынан екі есе көп дерекпен жұмыс істей алса да, өнімділік айтарлықтай артуы мүмкін емес. Мұның екі негізгі себебі бар: 16 байттық шекараға дейін дұрыс реттелмеген жадтағы SSE2 деректеріне қол жеткізу айтарлықтай кешігуге алып келуі мүмкін, ал ескі x86 жүзеге асыруларында SSE2 нұсқауларының өтімділігі MMX нұсқауларына қарағанда екі есе төмен болды. Intel бірінші мәселені SSE3 нұсқауын қосу арқылы шешті, бұл реттелмеген деректерге қол жеткізудің қосымша шығындарын азайтады және дұрыс емес жүктемелердің жалпы өнімділігін жақсартады, ал соңғы мәселені Core 2 Duo және одан кейінгі өнімдердегі Core микроархитектурасындағы орындау механизмін кеңейту арқылы шешті. MMX және x87 регистрлік файлдары бір-бірімен байланысты болғандықтан, MMX пайдалану x87 нұсқауларының күтілгендей жұмыс істеуіне кедергі келтіреді. MMX пайдаланғаннан кейін, бағдарламашы x87 регистрлік файлдың жұмысын қалпына келтіру үшін emms нұсқауын (C: mm empty) пайдалануы керек. Кейбір операциялық жүйелерде x87 жиі қолданылмайды, бірақ қосымша дәлдік қажет болған жағдайларда, мысалы, pow сияқты маңызды салаларда қолданылуы мүмкін. Мұндай жағдайларда, emms нұсқауын орындамаудан туындаған бұзылған қозғалатын нүктелік күй миллиондаған нұсқаулар бойында байқалмай қалуы мүмкін, содан кейін қозғалатын нүктелік режім сәтсіздікке ұшырап, NaN қайтарады. Мәселе MMX кодында жергілікті түрде көрінбейтіндіктен, қателерді табу және түзету көп уақытты алуы мүмкін. SSE2 мұндай мәселеге тап болмайды, әдетте әлдеқайда жақсы өнімділік көрсетеді және 64 биттік кодта көбірек регистрлерді ұсынады, сондықтан оны барлық векторлау жұмыстары үшін басымдықпен пайдалану керек.
Компиляторды пайдалану
2000 жылы енгізілген кезде SSE2 бағдарламалық құралдармен қолдау көрсетілмеді. Мысалы, Microsoft Visual Studio жобасында SSE2-ні пайдалану үшін бағдарламашы қолмен құрастыру кодын жазуға немесе сыртқы дереккөзден объектілік кодты импорттауға мәжбүр болды. Кейіннен Visual C++ Processor Pack Visual C++ және MASM-ге SSE2 қолдауын қосты. Intel C++ компиляторы қолмен жазылған құрастыруды пайдаланбастан SSE4, SSSE3, SSE3, SSE2 және SSE кодтарын автоматты түрде жасай алады. GCC 3 нұсқасынан бастап, GCC мақсаттық процессор осы нұсқауларды қолдаса, SSE/SSE2 скалярлық кодын автоматты түрде жасай алады. GCC 4 нұсқасынан бастап SSE/SSE2 үшін автоматты векторлау қосылды. Sun Studio Compiler Suite xvector=simd компилятор параметрі қолданылғанда SSE2 нұсқауларын да жасай алады. Microsoft Visual C++ 2012 нұсқасынан бастап, SSE2 нұсқауларын жасау опциясы компиляторда әдепкі бойынша қосылған.