ВУЗ:
Составители:
Рубрика:
- 84 -
же если указатели не разрешены (как в Fortran’e) и индексные выражения яв-
ляются линейными функциями, проблема является NP-трудной, т.е. эффек-
тивного алгоритма решения ее скорее всего не существует.
Ниже рассматриваются несколько полезных преобразований для циклов:
локализация, расширение скаляра, распределение цикла, слияние циклов, раз-
вертка и сжатие, развертка цикла, разделение на полосы, разделение на
блоки, перекос цикла, которые помогают выявлять параллельность, устранять
зависимости и оптимизировать использование памяти:
•
Перестановка циклов - внешний и внутренний циклы меняются местами.
•
Локализация - каждому процессу дается копия переменной.
•
Расширение скаляра - скаляр заменяется элементом массива.
•
Распределение цикла - один цикл расщепляется на два отдельных цикла.
•
Слияние циклов - два цикла объединяются в единый.
•
Развертка и сжатие - комбинируются перестановка циклов, разделение
на полосы и развертка.
•
Развертка цикла - тело цикла повторяется, благодаря чему выполняется
меньше итераций.
•
Разделение на полосы - итерации одного цикла разделяются на два вло-
женных цикла.
•
Разделение на блоки - область итераций разбивается на прямоугольные
блоки.
•
Перекос цикла - границы цикла изменяются таким образом, чтобы вы-
делить параллельность фронта волны.
Распределение циклов используется для устранения зависимости в цикле (фак-
тически для выявления параллелизма). Если исходный цикл имеет вид (здесь и
далее используется нотация языка программирования, равноудаленная и от For-
tran’а и от C)
for [i=1 to n] {
a[i] = … ;
… = … + a[i-1];
}
Здесь второй оператор тела цикла зависит от результата, вычисленного пер-
вым на предыдущей итерации. При условии отсутствия иных зависимостей
(кроме указанной) цикл распределяется следующим образом (каждый из двух
циклов легко распараллеливается, хотя сами циклы должны выполняться после-
довательно):
for [i=1 to n]
a[i] = … ;
- 84 - же если указатели не разрешены (как в Fortran’e) и индексные выражения яв- ляются линейными функциями, проблема является NP-трудной, т.е. эффек- тивного алгоритма решения ее скорее всего не существует. Ниже рассматриваются несколько полезных преобразований для циклов: локализация, расширение скаляра, распределение цикла, слияние циклов, раз- вертка и сжатие, развертка цикла, разделение на полосы, разделение на блоки, перекос цикла, которые помогают выявлять параллельность, устранять зависимости и оптимизировать использование памяти: • Перестановка циклов - внешний и внутренний циклы меняются местами. • Локализация - каждому процессу дается копия переменной. • Расширение скаляра - скаляр заменяется элементом массива. • Распределение цикла - один цикл расщепляется на два отдельных цикла. • Слияние циклов - два цикла объединяются в единый. • Развертка и сжатие - комбинируются перестановка циклов, разделение на полосы и развертка. • Развертка цикла - тело цикла повторяется, благодаря чему выполняется меньше итераций. • Разделение на полосы - итерации одного цикла разделяются на два вло- женных цикла. • Разделение на блоки - область итераций разбивается на прямоугольные блоки. • Перекос цикла - границы цикла изменяются таким образом, чтобы вы- делить параллельность фронта волны. Распределение циклов используется для устранения зависимости в цикле (фак- тически для выявления параллелизма). Если исходный цикл имеет вид (здесь и далее используется нотация языка программирования, равноудаленная и от For- tran’а и от C) for [i=1 to n] { a[i] = … ; … = … + a[i-1]; } Здесь второй оператор тела цикла зависит от результата, вычисленного пер- вым на предыдущей итерации. При условии отсутствия иных зависимостей (кроме указанной) цикл распределяется следующим образом (каждый из двух циклов легко распараллеливается, хотя сами циклы должны выполняться после- довательно): for [i=1 to n] a[i] = … ;
Страницы
- « первая
- ‹ предыдущая
- …
- 82
- 83
- 84
- 85
- 86
- …
- следующая ›
- последняя »