Нормаланған цикл - Normalized loop

Жылы есептеу техникасы, а қалыпқа келтірілген цикл (кейде өзін-өзі ұстайтын цикл деп атайды), бұл цикл айнымалысы 0-ден (немесе кез-келген тұрақтыдан) басталып, шығу шарты орындалғанға дейін әр қайталанған сайын бір-бірден көбейетін цикл. Нормаланған циклдар өте маңызды компилятор теориясы, циклге тәуелділікті талдау өйткені олар деректерге тәуелділік талдау.[дәйексөз қажет ]

Жақсы тәртіпті ілмектер

Әдепті цикл әдетте келесі формада болады:

үшін ( мен = 0; мен < MAX; мен++ )  а[мен] = б[мен] + 5;

Өсім біртұтас және тұрақты болғандықтан, мұны, егер екеуі де болса, байқау өте оңай а және б MAX-тен үлкен, бұл цикл ешқашан бөлінген ауқымнан тыс жадқа кіре алмайды.

Нормаланбаған ілмектер

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

Қарапайым мысал, ол басында басталмайды және бірнеше көбейеді:

// 1-мысалүшін ( мен = 7; мен < MAX; мен+=3 )  а[мен] = б[мен] + 5;

Қосымша шығу шартымен неғұрлым күрделі мысал:

// 2-мысалүшін ( мен = 7; мен < MAX || мен > МИН; мен+=3 )  а[мен] = б[мен] + 5;

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

// 3-мысалүшін ( мен = 7; мен < MAX && а[мен]; мен+=3 )  а[мен] = б[мен] + 5;

Немесе функционалдық қоңыраулар арқылы динамикалық есептеулер:

// 4-мысалүшін ( мен = бастау(); мен < макс(); мен+=өсім() )  а[мен] = б[мен] + 5;

Кері ілмектер де өте қарапайым және оларды қалыпқа келтіруге болады:

// 5-мысалүшін ( мен = MAX; мен > 0; мен-- )  а[мен] = б[мен] + 5;

Нормаланған циклге түрлендіру

Егер нормаланбаған динамикалық мінез-құлық болмаса, оны қалыпты жағдайға айналдыру өте оңай. Мысалы, жоғарыдағы бірінші мысалды (1-мысал) оңай түрлендіруге болады:

// 1-мысал -> қалыпқа келтірілгенүшін ( мен = 0; мен < (MAX-7)/3; мен++ )  а[мен*3+7] = б[мен*3+7] + 5;

Үшінші мысалды параллельдеуге мүмкіндік беру үшін ішінара қалыпқа келтіруге болады, бірақ цикл аралығын білу мүмкіндігі жоқ (қанша қайталану болады), сондықтан мультимедиа жабдықтарын қолдану арқылы векторландыру қиындайды.

7-ден басталу қиын емес, егер өсім тұрақты болса, жақсырақ бір. Цикл ішіндегі бірнеше операторлар индексті қолданған кезде әр түрлі қайталану қарқынына төтеп беру үшін кейбір жеке уақытша айнымалылар құрылуы мүмкін.

Кері циклды (5-мысал) қалыпқа келтіру де оңай:

// 5-мысал -> қалыпқа келтірілгенүшін ( мен = 0; мен < MAX; мен++ )  а[MAX-мен] = б[MAX-мен] + 5;

Қатынас әлі де артқа екенін ескеріңіз. Бұл жағдайда оны артқа қалдыру мағынасы жоқ (өйткені жоқ деректерге тәуелділік ), бірақ тәуелділіктер болған кезде, рұқсатты қайтаруға да сақ болу керек, себебі бұл тапсырыстардың тәртібін бұзуы мүмкін.

Мүмкін емес конверсиялар

Жоғарыдағы 4 мысал сол циклден ештеңе болжауға мүмкіндік бермейді. Функциялардың өздері тривиальды (тұрақты) болмаса, цикл қай жерден басталатынын, тоқтайтынын және оның әрбір итерацияны қанша арттыратынын білуге ​​мүмкіндік жоқ. Бұл ілмектерді параллельдеу қиын ғана емес, сонымен қатар олар өте қорқынышты.

Әрбір қайталану, цикл екі функцияны бағалайды (максимум () және өсім ()). Функциялар сызылған болса да, жағдай өте оңтайландыруға тұрарлықтай күрделі болады. Бағдарламалаушы өте қажет болмаса, бұл ілмектерді жасамауға ерекше назар аударуы керек (егер қажет болса).

Мұндай ілмектердің тағы бір қауіптілігі, егер бағалау өзгертілген деректерге байланысты болса пайда болады. Мысалы, итераторларды қолданған кездегі қателік - бұл оны өзгерту кезінде тізімнен элементтерді алып тастау немесе өлшемдерге сүйену (шығу шарты үшін) бұдан да дұрыс емес.

Сондай-ақ қараңыз