Кіріспе

Компьютерлік ғылымда циклдың бөлінуі (немесе циклдың таралуы) — бұл компилятордың оптимизациясы, онда цикл бірдей индекс диапазонында бірнеше циклға бөлінеді, әрқайсысы бастапқы цикл денесінің тек бір бөлігін орындайды. Мақсаты – үлкен цикл денесін кішірек бөліктерге бөліп, деректерге сілтеме жасаудың тиімділігін арттыру. Бұл оптимизация көп ядролы процессорларда ең тиімді, себебі олар бір тапсырманы әр процессор үшін бірнеше тапсырмаға бөле алады. Керісінше, циклдың біріктірілуі (немесе циклдың жабысуы) — компилятордың оптимизациясы және циклды түрлендіру, ол бірнеше циклды бір циклға алмастырады. Циклдың біріктірілуінің тағы бір артықшылығы — ол цикл басқару құрылымдарының қосымша шығындарын болдырмайды, сонымен қатар цикл денесін процессормен параллельдетуге мүмкіндік береді, нұсқаулар деңгейінде параллелизмді пайдалана отырып. Бұл екі цикл денесі арасында деректерге тәуелділік болмаған жағдайда мүмкін (бұл жоғарыда сипатталған циклдың біріктірілуінің басқа бір маңызды артықшылығына қарама-қарсы келеді, ол тек деректерге тәуелділік болғанда ғана пайда болады, олар нәтижелерді сақтау үшін аралық бөлуді қажет етеді). Егер циклдың біріктірілуі артық бөлінуді жойса, өнімділік айтарлықтай артуы мүмкін. Алайда, clang 12.0.0 және gcc 11.1 нұсқаларында бұл циклдың біріктірілуі және артық бөлінуді жою тіпті ең жоғары оптимизация деңгейінде де жүргізілмейді. Сандық есептеуге бағытталған кейбір тілдер, мысалы, Julia, циклдың біріктірілуі концепциясын жоғары деңгейде енгізген болуы мүмкін, онда компилятор жақын орналасқан элементтік операцияларды анықтап, оларды бір циклға біріктіреді. Қазіргі уақытта, C++ сияқты жалпы мақсаттағы тілдерде осы синтаксиске қол жеткізу үшін sin және operator+ функциялары өз нәтижелерін сақтау үшін массивтерді пессимистік түрде бөлуі керек, себебі олар қандай контексттен шақырылатындығын білмейді. Бұл мәселені C++-да қажетсіз уақытша бөлінуді жою үшін компиляторға сүйенбейтін басқа синтаксис қолдану арқылы шешуге болады (мысалы, оператор+= немесе std::transform сияқты орынды операциялар үшін функциялар мен жүктемелерді пайдалану).