Кіріспе

Автоматты векторизация, параллель есептеуде, автоматты параллельдеудің ерекше жағдайы болып табылады, онда компьютерлік бағдарлама бір уақытта бір жұп операндты өңдейтін скалярлық түсінілімнен, бір операцияны бірнеше жұп операндқа бірден қолданатын векторлық түсінілімге айналады. Мысалы, қазіргі заманғы компьютерлер, оның ішінде арнайы суперкомпьютерлерде де, SIMD немесе SPMD аппараттық құралдары арқылы келесідей төрт қосылымды бір мезгілде орындайтын векторлық операциялар кездеседі:

Дегенмен, көптеген бағдарламалау тілдерінде көптеген сандарды тізбектеп қосатын циклдар жазылады. Міне, C тілінде жазылған мұндай циклдің мысалы:
for (i = 0; i < n; i++)
c[i] = a[i] + b[i];

Векторлайтын компилятор мұндай циклдарды векторлық операциялар тізбегіне түрлендіреді. Бұл векторлық операциялар a, b және c массивтерінен элементтер блогы бойынша қосуды орындайды. Автоматты векторизация – компьютерлік ғылымдағы маңызды зерттеу тақырыбы.

Өмірбаян

Ертедегі компьютерлерде әдетте бір логикалық құрылым болды, ол бір уақытта бір операндар жұбына бір команданы орындады. Сондықтан компьютерлік тілдер мен бағдарламалар тізбектеп орындалатындай етіп жасалды. Бірақ қазіргі компьютерлер бір мезгілде көп нәрсе істей алады. Сондықтан көптеген оптимизациялық компиляторлар автоматты векторлауды жүзеге асырады, онда тізбекті бағдарламалардың бөліктері параллель операцияларға айналады. Loop vectorization процедуралық циклдарды әр операндар жұбына өңдеу бірлігін тағайындау арқылы өзгертеді. Бағдарламалар өз уақытының көп бөлігін осындай циклдарда өткізеді. Сондықтан векторлау оларды айтарлықтай жылдамдатуы мүмкін, әсіресе үлкен деректер жиынтығымен жұмыс істегенде. Loop vectorization Intel-дің MMX, SSE және AVX, Power ISA-ның AltiVec және ARM-ның NEON, SVE және SVE2 командалар жиынтықтарында іске асырылады. Көптеген шектеулер векторлаудың алдын келеді немесе оған кедергі келтіреді. Кейде векторлау орындауды баяулатуы мүмкін, мысалы, құбыр желісін синхрондау немесе деректерді жылжыту уақытынан туындайтын мәселелерге байланысты. Loop тәуелділік талдауы циклдардың ішіндегі командалардың деректерге тәуелділігіне сүйене отырып, векторлауға болатын циклдарды анықтайды.

Кепілдіктер

Автоматты векторизация, кез келген циклды оптимизация немесе басқа компиляция уақытында жасалатын оптимизация сияқты, бағдарламаның жұмысын өзгеріссіз сақтауы тиіс.

Деректерден тәуелділік

Қате нәтижелерді болдырмау үшін орындау барысында барлық тәуелділіктер сақталуы тиіс. Әдетте, циклдық өзгермейтін тәуелділіктер және лексикалық алға бағытталған тәуелділіктерді векторлау оңай, ал лексикалық кері бағытталған тәуелділіктерді лексикалық алға бағытталған тәуелділіктерге түрлендіруге болады. Дегенмен, бұл түрлендірулер қауіпсіз болуы керек, барлық операторлар арасындағы тәуелділіктер бастапқы мағынасын сақтайтынына көз жеткізу үшін. Циклдық тәуелділіктерді векторланған нұсқаулардан тәуелсіз өңдеу қажет.

Деректердің дәлдігі

Векторлық нұсқауларды орындау кезінде бүтін сандардың дәлдігі (биттік көлемі) сақталуы керек. Ішкі бүтін сандардың мөлшері мен қасиеттеріне сәйкес дұрыс векторлық нұсқау таңдалуы тиіс. Аралас бүтін сан түрлерін дұрыс кеңейту/қысқарту үшін де ерекше көңіл бөлу қажет, дәлдік жоғалмауы үшін. Бірнеше бүтін сан бір тіркеуіште (регистрде) сақталғандықтан, таңбаны кеңейту кезінде және ығысу (shift) операцияларында, немесе көтерілмелі (carry) біттері ескерілетін операцияларда ерекше сақтық қажет. IEEE 754 стандарты өшірілмесе, қозғалатын нүкте (floating point) дәлдігі де сақталуы керек, онда операциялар жылдамырақ орындалады, бірақ нәтижелерде шамалы айырмашылықтар болуы мүмкін. IEEE 754 ескерілмесе де, үлкен ауытқулар көбінесе бағдарламалаушының қатесін көрсетеді.

Теория

Бағдарламаны векторлау үшін компилятордың оптимизаторы ең алдымен операторлар арасындағы тәуелділіктерді түсінуі керек, және қажет болса, оларды қайта құруы тиіс. Тәуелділіктер анықталғаннан кейін, оптимизатор орындалатын нұсқауларды дұрыс реттеп, векторлық нұсқауларға айналдыруға болатын кандидаттарды өзгертуі керек, бұл нұсқаулар бірнеше дерек элементімен жұмыс істейді.

Кластерлеу

Графикті пайдаланып, оптимизатор қатты байланысқан компоненттерді (SCC) кластерлей алады және векторланатын операторларды қалғандарынан бөліп шығарады. Мысалы, цикл ішінде үш операторлық топтан тұратын бағдарлама фрагментін қарастырайық: (SCC1+SCC2), SCC3 және SCC4, осы ретпен, мұнда тек екінші топты (SCC3) ғана векторлауға болады. Соңғы бағдарламада әр топқа бір циклдан – үш цикл болады, олардың тек ортаңғысы ғана векторланған болады. Оптимизатор бірінші топты соңғы топпен біріктіре алмайды, себебі бұл операторлардың орындалу ретін бұзуға әкеледі, ал бұл қажетті кепілдіктерге қайшы келеді.

Қолмен векторлық өңдеу

Көптеген C және C++ компиляторларында бағдарламашының күш-жігері мен қолдауға қатысты қиындықтар туғызатын, қолмен векторлау үшін ішкі функцияларды қолдануға болады.