Политоптық модель - Polytope model

The көпсалалы модель (деп те аталады политоп әдісі) - бұл көптеген операцияларды орындайтын бағдарламалардың математикалық негізі, сондықтан оларды нақты санау үшін өте үлкен - осылайша ықшам өкілдік. Кірістірілген цикл бағдарламалары типтік болып табылады, бірақ жалғыз мысал емес, және модельдің ең көп қолданылуы осыған арналған цикл ұясын оңтайландыру жылы бағдарламаны оңтайландыру. Көпсалалы әдіс әр ілмектің қайталануын кірістірілген циклдар ретінде қарастырады торлы нүктелер ішінде математикалық объектілер деп аталады полиэдра, орындайды аффиналық түрленулер немесе одан да көп аффинді емес түрлендірулер плитка төсеу политоптарда, содан кейін түрлендірілген политоптарды эквивалентті түрлендіреді, бірақ оңтайландырылған (мақсатты оңтайландыру мақсатына байланысты) полиэдраны сканерлеу арқылы цикл ұялары.

Қарапайым мысал

-Де жазылған келесі мысалды қарастырайық C:

  const int n = 100;  int мен, j, а[n][n];  үшін (мен = 1; мен < n; мен++) {    үшін (j = 1; j < (мен + 2) && j < n; j++) {      а[мен][j] = а[мен - 1][j] + а[мен][j - 1];    }  }

Бұл кодтың маңызды мәселесі ішкі циклдің әр қайталануы a [i] [j] алдыңғы итерацияның нәтижесін талап етеді, a [i] [j - 1], қазірдің өзінде қол жетімді. Сондықтан бұл кодты параллельдеу мүмкін емес немесе құбырлы қазіргі кезде жазылғандай.

Аффинді түрлендірумен политоптық модельді қолдану және шекаралардың тиісті өзгеруі жоғарыдағы кірістірілген циклдарды келесіге айналдырады:

      а[мен - j][j] = а[мен - j - 1][j] + а[мен - j][j - 1];

Бұл жағдайда ішкі циклдің қайталануы алдыңғы итерация нәтижелеріне байланысты болмайды; бүкіл ішкі циклды параллель орындауға болады. (Алайда, сыртқы циклдің әр қайталануы алдыңғы қайталануларға байланысты болады.)

Толық мысал

Тәуелділіктері src, бұрын циклды бұру. Қызыл нүкте сәйкес келеді src [1] [0]; қызғылт нүкте сәйкес келеді src [2] [2].

Келесісі C код қате тарату формасын жүзеге асырады терістеу ұқсас Флойд-Штайнберг терморегуляциясы, бірақ педагогикалық себептерге байланысты өзгертілген. Екі өлшемді массив src қамтиды сағ қатарлары w пикселдер, әр пиксельде a бар сұр реңк мәні 0 мен 255 қоса алғанда. Күнделікті жұмыс аяқталғаннан кейін, шығыс жиым дст тек 0 мәні немесе 255 мәні бар пикселдерден тұрады. Есептеу кезінде әрбір пикселдің ауытқу қателігі оны қайтадан қосу арқылы жиналады src массив. (Байқаңыз src және дст есептеу кезінде оқылады және жазылады; src тек оқуға болмайды және дст тек жазуға болмайды.)

Әрбір қайталануы ішкі цикл мәндерін өзгертеді src [i] [j] мәндеріне негізделген src [i-1] [j], src [i] [j-1], және src [i + 1] [j-1]. (Дәл осындай тәуелділіктер де қолданылады dst [i] [j]. Мақсаттары үшін циклды бұру, біз ойлауға болады src [i] [j] және dst [i] [j] сол сияқты.) тәуелділіктерін көрсете аламыз src [i] [j] графикалық, оң жақтағы сызбадағыдай.

# ERR анықтау (x, y) (dst [x] [y] - src [x] [y])жарамсыз солай(қол қойылмаған char** src, қол қойылмаған char** дст, int w, int сағ){    int мен, j;    үшін (j = 0; j < сағ; ++j) {        үшін (мен = 0; мен < w; ++мен) {            int v = src[мен][j];            егер (мен > 0)                v -= ERR(мен - 1, j) / 2;            егер (j > 0) {                v -= ERR(мен, j - 1) / 4;                егер (мен < w - 1)                    v -= ERR(мен + 1, j - 1) / 4;            }            дст[мен][j] = (v < 128) ? 0 : 255;            src[мен][j] = (v < 0) ? 0 : (v < 255) ? v : 255;        }    }}
Тәуелділіктері src, цикл қисаюынан кейін. Массив элементтері ретімен өңделетін болады сұр, қызыл, жасыл, көк, сары ...

Аффиналық трансформацияны орындау тәуелділіктің бастапқы диаграммасында келесі суретте көрсетілген жаңа диаграмма пайда болады. Содан кейін біз кодты қайта жаза аламыз б және т орнына мен және j, келесі «бұрмаланған» күн тәртібін алу.

 жарамсыз dither_skewed(қол қойылмаған char **src, қол қойылмаған char **дст, int w, int сағ)   {     int т, б;     үшін (т = 0; т < (w + (2 * сағ)); ++т) {         int pmin = макс(т % 2, т - (2 * сағ) + 2);         int pmax = мин(т, w - 1);         үшін (б = pmin; б <= pmax; б += 2) {             int мен = б;             int j = (т - б) / 2;             int v = src[мен][j];             егер (мен > 0)               v -= ERR(мен - 1, j) / 2;             егер (j > 0)               v -= ERR(мен, j - 1) / 4;             егер (j > 0 && мен < w - 1)               v -= ERR(мен + 1, j - 1) / 4;             дст[мен][j] = (v < 128) ? 0 : 255;             src[мен][j] = (v < 0) ? 0 : (v < 255) ? v : 255;         }     } }

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

Сыртқы сілтемелер және қолданған әдебиет тізімі

  • «Негізгі политоп әдісі», Мартин Гриблдің жоғарыдағы жалған код мысалының сызбаларын қамтитын оқулығы
  • «Политоптық модельдегі кодты құру» (1998). Мартин Грибл, Кристиан Ленгауэр және Сабин Ветцель
  • «CLooG Polyhedral Code Generator»
  • «CodeGen +: Z-polyhedra сканерлеу»[тұрақты өлі сілтеме ]
  • PoCC: Polyhedral Compiler коллекциясы
  • PLUTO - аффинді цикл ұяларына арналған автоматты параллелизатор және локалды оптимизатор
    • Бондхугула, Удай; Хартоно, Альберт; Раманужам Дж .; Садаяппан, П. (2008-01-01). Практикалық автоматты полиэфирлік параллелизатор және локалды оптимизатор. Бағдарламалау тілдерін жобалау және енгізу бойынша 29-шы ACM SIGPLAN конференциясының материалдары. PLDI '08. Нью-Йорк, Нью-Йорк, АҚШ: ACM. 101–113 бб. дои:10.1145/1375581.1375595. ISBN  9781595938602.
  • polyhedral.info - полидрлік компиляция туралы ақпарат жинайтын веб-сайт
  • Polly - жоғары деңгейлі цикл және деректер орналасуын оңтайландыру үшін LLVM шеңбері
  • MIT Тирамису көпқырлы Негіздеме.