Jump to content

Модель многогранника

Многогранная модель (также называемая методом многогранника ) — это математическая основа для программ, выполняющих большое количество операций — слишком большое, чтобы их можно было явно перечислить, — поэтому требующее компактного представления. Программы с вложенными циклами являются типичным, но не единственным примером, и наиболее часто эта модель используется для оптимизации гнезда циклов при оптимизации программ . Метод многогранников обрабатывает каждую итерацию цикла внутри вложенных циклов как точки решетки внутри математических объектов, называемых многогранниками , выполняет аффинные преобразования или более общие неаффинные преобразования, такие как мозаика на многогранниках, а затем преобразует преобразованные многогранники в эквивалентные, но оптимизированные (в зависимости от целевая оптимизация), вложение циклов посредством сканирования многогранников.

Простой пример

[ редактировать ]

Рассмотрим следующий пример, написанный на C :

константное   число   n   =   100  ;  int   i  ,   j  ,   a  [  n  ][  n  ];  для   (  я   знак равно   1  ;   я   <   п  ;   я  ++  )   {    для   (  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  ]; 

В этом случае ни одна итерация внутреннего цикла не зависит от результатов предыдущей итерации; весь внутренний цикл может выполняться параллельно. Действительно, учитывая a(i, j) = a[i-j][j] затем a(i, j) зависит только от a(i - 1, x), с . (Однако каждая итерация внешнего цикла зависит от предыдущих итераций.)

Подробный пример

[ редактировать ]
Зависимости src, до перекоса цикла . Красная точка соответствует src[1][0]; розовая точка соответствует src[2][2].

Следующий код C реализует форму сглаживания распределения ошибок, аналогичную сглаживанию Флойда-Стейнберга , но модифицированную по педагогическим причинам. Двумерный массив src содержит h ряды w пикселей, причем каждый пиксель имеет значение шкалы серого от 0 до 255 включительно. После завершения процедуры выходной массив dst будет содержать только пиксели со значением 0 или 255. Во время вычислений ошибка размывания каждого пикселя собирается путем добавления ее обратно в src множество. (Обратите внимание, что src и dst считываются и записываются во время вычислений; src не доступен только для чтения, и dst не только для записи.)

Каждая итерация внутреннего цикла изменяет значения в 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] графически, как на схеме справа.

#define ERR(x, y) (dst[x][y] - src[x][y])  void   dither  (  unsigned   char  **   src  ,   unsigned   char  **   dst  ,   int   w  ,   int   h  )  {      int   i  ,   Дж  ;      для   (  j   знак равно   0  ;   j   <   час  ;   ++  j  )   {          для   (  я   знак равно   0  ;   я   <   ш  ;   ++  я  )   {              int   v   =   src  [  я  ] [  j  ];              если   (  я   >   0  )                  v   -=   ERR  (  я   -   1  ,   j  )   /   2  ;              если   (  j   >   0  )   {                  v   -=   ERR  (  я  ,   j   -   1  )   /   4  ;                  если   (  я   <   ш   -   1  )                      v   -=   ERR  (  я   +   1  ,   j   -   1  )   /   4  ;              }              dst  [  я  ][  j  ]   знак равно   (  v   <   128  )   ?   0   :   255  ;              источник  [  я  ][  j  ]   знак равно   (  v   <   0  )   ?   0   :   (  v   <   255  )   ?   в   :   255  ;          }      }  } 
Зависимости src, после перекоса цикла. Элементы массива будут обрабатываться в следующем порядке: серый, красный, зеленый, синий, желтый...

Выполнение аффинного преобразования на исходной диаграмме зависимостей дает нам новую диаграмму, которая показана на следующем изображении. Затем мы можем переписать код для зацикливания p и t вместо i и j, получив следующую «перекошенную» процедуру.

 void   dither_skewed  (  unsigned   char   **  src  ,   unsigned   char   **  dst  ,   int   w  ,   int   h  )     {       int   t  ,   p  ;       for   (  t   =   0  ;   t   <   (  w   +   (  2   *   h  ));   ++  t  )   {           int   pmin   =   max  (  t   %   2  ,   t   -   (  2   *   h  )   +   2  );           int   pmax   =   min  (  t  ,   w   -   1  );           для   (  п   знак равно   pmin  ;   п   <=   pmax  ;   п   +=   2  )   {               int   я   знак равно   п  ;               интервал   j   знак равно   (  т   -   п  )   /   2  ;               int   v   =   источник  [  i  ][  j  ];               если   (  я   >   0  )                 v   -=   ERR  (  я   -   1  ,   j  )   /   2  ;               если   (  j   >   0  )                 v   -=   ERR  (  i  ,   j   -   1  )   /   4  ;               если   (  j   >   0   &&   я   <   w   -   1  )                 v   -=   ERR  (  я   +   1  ,   j   -   1  )   /   4  ;               dst  [  я  ][  j  ]   знак равно   (  v   <   128  )   ?   0   :   255  ;               источник  [  я  ][  j  ]   знак равно   (  v   <   0  )   ?   0   :   (  v   <   255  )   ?   в   :   255  ;           }       }   } 

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5aee497fb7c7369c0380ee1fc303a465__1692360960
URL1:https://arc.ask3.ru/arc/aa/5a/65/5aee497fb7c7369c0380ee1fc303a465.html
Заголовок, (Title) документа по адресу, URL1:
Polytope model - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)