Кіріспе

Компилятор теориясында, цикл алмасу – ұялы циклдарда қолданылатын екі итерациялық айнымалының ретін ауыстыру процесі. Ішкі циклда қолданылатын айнымалы сыртқы циклға, ал сыртқы циклда қолданылатын айнымалы ішкі циклға көшеді. Бұл көбінесе көп өлшемді массив элементтеріне жадта сақталған ретімен қол жеткізуді қамтамасыз ету үшін жасалады, бұл деректерге сілтеме жасаудың тиімділігін арттырады. Мысалы, келесі код фрагментін қарастырайық:

j үшін 0-ден 20-ға дейін
i үшін 0-ден 10-ға дейін
a[i,j] = i + j

Цикл алмасу нәтижесінде:

i үшін 0-ден 10-ға дейін
j үшін 0-ден 20-ға дейін
a[i,j] = i + j

Кейде мұндай түрлендіру массивке тағайындаудың автоматты векторылауы сияқты қосымша оңтайландыру мүмкіндіктерін тудыруы мүмкін.

Бұрандалы алмасудың пайдалылығы

Бұрау алмасудың басты мақсаты – массив элементтеріне қатынауда процессордың кэшін тиімді пайдалану. Процессор массив элементіне алғаш рет қатынасқанда, жадтан кэшке деректердің толық блогын жүктейді. Бұл блок алғашқы элементтен кейін де бірнеше тікелей элементтерді қамтуы мүмкін, сондықтан келесі массив элементіне қатынасқанда ол тікелей кэштен алынады (бұл баяу негізгі жадтан алуға қарағанда жылдам). Егер цикл ішіндегі қатарласа орналасқан массив элементтері әртүрлі кэш блогынан алынса, кэш қателіктері туындайды, ал бұрау алмасу мұны болдырмауға көмектеседі. Бұрау алмасудың тиімділігі қолданылатын аппараттық құрылғының кэш моделіне және компилятор қолданатын массив моделіне байланысты, осы факторлар ескерілуі керек. C бағдарламалау тілінде массив элементтері бір қатарда жадта тікелей сақталады (a[1,1], a[1,2], a[1,3]) – қатар бойынша ретпен. Ал FORTRAN бағдарламалары бір бағандағы массив элементтерін (a[1,1], a[2,1], a[3,1]) баған бойынша ретпен сақтайды. Осылайша, бірінші мысалдағы итерациялық айнымалылардың реті C бағдарламасы үшін қолайлы, ал екінші мысал FORTRAN үшін тиімді. Оптимизациялайтын компиляторлар бағдарламашылардың дұрыс емес ретін анықтап, кэштің жақсы жұмыс істеуін қамтамасыз ету үшін ретті өзгерте алады.

Қауіпсіздік

Итерациялық айнымалыларды алмастыру әрқашан қауіпсіз болмайды, өйткені олардың орындалу ретіне қатысты нұсқаулар арасында тәуелділік болуы мүмкін. Компилятор циклдарды қауіпсіз алмастыра алатынын анықтау үшін тәуелділіктерді талдау қажет.