SIMULATION OF THE DIFFUSION OF THE DONORS

advertisement
Лиходед Николай Александрович, доктор физико-математических
наук, профессор, профессор факультета прикладной математики и информатики Белорусского государственного университета
Лекция
«Тайлинг для вычислений на параллельных компьютерах»
Тайлинг для вычислений на параллельных компьютерах
Тайлинг (tiling) – это преобразование алгоритма для получения макроопераций, называемых зерном вычислений или тайлами. Под зерном
вычислений (или тайлом) понимается множество операций алгоритма, выполняемых атомарно: вычисления, принадлежащие одному зерну, не могут прерываться синхронизацией или обменом данными, требуемыми для
выполнения этих операций. Разбиение операций алгоритма на тайлы позволяет при подходящем задании тайлов уменьшить накладных расходов
на обмен данными и использование памяти при последовательных и параллельных вычислениях.
При тайлинге каждый цикл алгоритма, представленного последовательной программой, разбивается на два цикла: глобальный, параметр которого определяет на данном уровне вложенности порядок вычисления
тайлов, и локальный, в котором параметр исходного цикла изменяется в
границах одного тайла. Допускается вырожденное разбиение цикла, при
котором все итерации относятся к глобальному циклу или все итерации
относятся к локальному циклу. Такие циклы будем называть соответственно глобальными неразбиваемыми и локальными неразбиваемыми.
По смыслу тайлинга, для каждого набора операторов локальные
циклы должны быть самыми внутренними. Поэтому общие для операторов
локальные циклы распределяются между циклами операторов, если только
операторы не окружены одинаковым наборов циклов; локальные циклы
переставляются с глобальными и становятся самыми внутренними.
Приведем примеры, иллюстрирующие технику тайлинга, и примеры
применения тайлинга.
Пример 1 (разбиение всех циклов гнезда вложенных циклов; два
вида записи алгоритма после тайлинга). Рассмотрим два вложенных цикла:
do i = 1, N1
do j = 1, N2
S(i, j)
enddo
enddo
Пусть параметры r1 и r2 задают размеры полных тайлов, числа Q1, и Q2 ха-
1
рактеризуют число тайлов. Разобьем каждый цикл на глобальный и локальный циклы (пояснения для случая N1= 6, N2=11 приведены на первом
рисунке):
do i gl = 1, Q1
do i = 1 + ( i gl –1) r1, min( i gl r1, N1)
do j gl = 1, Q2
do j = 1 + ( j gl –1) r2, min( j gl r2, N2)
S(i, j)
enddo
enddo
enddo
enddo
 N1 
 N2 
 , Q2    .
 r1 
 r2 
Если считать параметры r1 и r2 заданными числами, то Q1  
r2 = 3
r2 = 1
r1 = 2
r1 = 3
После перестановки циклов с параметрами i и j gl (локальные циклы
должны быть самыми внутренними) получим
do i gl = 1, Q1
do j gl = 1, Q2
do i = 1 + ( i gl –1) r1, min( i gl r1, N1)
do j = 1 + ( j gl –1) r2, min( j gl r2, N2)
2
S(i, j)
enddo
enddo
enddo
enddo
Глобальные циклы определяют порядок вычисления тайлов, локальные
циклы определяют порядок вычисления итераций исходного алголритма в
границах одного тайла:
do i gl = 1, Q1
do j gl = 1, Q2
Tile( i gl , j gl )
enddo
enddo
где вычисления одного тайла Tile( i gl , j gl ) задаются двумерным циклом
do i = 1 + ( i gl –1) r1, min( i gl r1, N1)
do j = 1 + ( j gl –1) r2, min( j gl r2, N2)
S(i, j)
enddo
enddo
Заметим, что в литературе используется также запись, в которой параметры глобальных циклов изменяются с шагом, определяемым размерами тайла:
do i gl = 1, N1, r1
do j gl = 1, N2, r2
do i = i gl , min( i gl +r1–1, N1)
do j = j gl , min( j gl +r2 –1, N2)
S(i, j)
enddo
enddo
enddo
enddo
Пример 2 (неразбиваемые глобальные циклы, неразбиваемые локальные циклы). Пусть в рассмотренном примере r2=1; тогда (пояснения
для случая N1= 7, N2=11 приведены на рисунке выше по тексту):
do i gl = 1, Q1
do j gl = 1, N2
Tile( i gl , j gl )
3
enddo
enddo
где вычисления тайла Tile( i gl , j gl ) задаются циклом
do i = 1 + ( i gl –1) r1, min( i gl r1, N1)
S(i, j)
enddo
 N2 
)
 r2 
Если r2=N2, то получим (напомним, Q2  
do i gl = 1, Q1
Tile( i gl ,1)
enddo
где вычисления тайла Tile( i gl , j gl ) есть
do i = 1 + ( i gl –1) r1, min( i gl r1, N1)
do j = 1, N2
S(i, j)
enddo
enddo
Таким образом, если по какой-либо координате размер тайла равен
единице, то соответствующий цикл является глобальным неразбиваемым,
а если по какой-либо координате размер тайла равен числу параметров
цикла, то соответствующий цикл является локальным неразбиваемым.
Любопытно отметить, что случай r1=N1, r2=1 фактически означает
перестановку циклов исходного алгоритма:
do j gl = 1, N2
Tile(1, j gl )
enddo
где вычисления одного тайла Tile( i gl , j gl ) есть
do i = 1, N1
S(i, j)
enddo
4
r2 = 1
r2 = N
r1 = 2
r1 = N
Пример 3 ([2], метод окаймления). Рассмотрим двумерный цикл, у
которого итерационная область не является прямоугольным параллелепипедом:
do k = 1, N1
do i = k+1, k+N2
S(k, i)
enddo
enddo
После применения тайлинга (пояснения для случая N1=N2=6, r1=r2=2 при N1 
 N1  N 2  1
 , Q2  
 ): получим
r2
 r1 


ведены на рисунке, Q1  
do k gl = 1, Q1
do i gl = 1, Q2
do k = 1 + ( k gl –1) r1, min( k gl r1, N1)
do i = max(1 + ( i gl –1) r2, k+1), min( i gl r2, k+N2)
S(k, i)
enddo
enddo
enddo
enddo
На рисунке видно, что часть тайлов являются пустыми или неполными; представленный подход, при котором допускаются избыточные области изменения параметров глобальных циклов, называется методом
окаймления.
5
V
igl = 6
igl = 5
igl =
4
igl = 3
igl = 2
igl = 1
kgl = 1
Виды тайлов:
kgl = 2
– полный
kgl = 3
– частично
заполненный
6
– пустой
Пример 4 (задание зерна вычислений в параллельных вычислительных процессах). Рассмотрим основную часть алгоритма решения двумерной задачи Дирихле уравнения Пуассона методом верхней релаксации:
do m = 1, M
do i = 1, Nx – 1
do j = 1, Ny – 1
u(i,j)=F(u(i–1,j),u(i,j–1),u(i,j),u(i,j+1),u(i+1,j))
(1)
enddo
enddo
enddo
Будем считать цикл с параметром m глобальным не разбиваемым, а цикл с
параметром j локальным не разбиваемым. Произведем разбиение цикла
уровня вложенности 2: заменим цикл по i двумерной циклической конструкцией. Обозначим через Q2 число итераций в первом новом цикле, а
через r2 (наибольшее) число значений параметра i во втором цикле; пара N x  1
 N x  1
 , r2  
 . Получим
 r2 
 Q2 
метры Q2 и r2 связаны соотношениями Q2  
do m = 1, M
do i gl = 1, Q2
do i = 1 + ( i gl – 1) r2, min( i gl r2, Nx – 1)
do j = 1, Ny – 1
u(i,j)=F(u(i–1,j),u(i,j–1),u(i,j),u(i,j+1),u(i+1,j))
enddo
enddo
enddo
enddo
Пусть Q2  число процессов (процессоров), предназначенных для реализации трехмерного цикла (1). Единый для каждого из Q2 процессоров
псевдокод параллельного алгоритма можно записать следующим образом
( i gl  номер процесса):
if 1  i gl  Q2
do m = 1, M
Tile(m, i gl )
обмен данными (синхронизация)
enddo
где вычисления тайла Tile(m, i gl ) задаются двумерным циклом
do i = 1 + ( i gl – 1)r2, min( i gl r2, Nx – 1)
do j = 1, Ny – 1
u(i,j)=F(u(i–1,j),u(i,j–1),u(i,j),u(i,j+1),u(i+1,j))
enddo
enddo
7
Каждый процесс i gl на каждой итерации m выполняет операции одного
тайла (одного зерна вычислений). Параметры r2 и (Ny – 1) задают размер
зерна вычислений: число итераций, принадлежащих одному тайлу (кроме,
возможно, граничных тайлов), равно r2  (Ny – 1).
Пример 5 (улучшение локальности при последовательных вычислениях). Рассмотрим алгоритм Гаусса-Жордана решения систем N линейных
алгебраических уравнений с N неизвестными и P правыми частями:
do k=1,N
l(1)=1/a(1,k)
do p=2,N
l(p)= –a(p,k)
enddo
do j=k+1,N+P
u(j)=a(1,j)l(1)
do i=2,N
a(i–1,j)=a(i,j)+l(i)u(j)
enddo
a(N,j)=u(j)
enddo
enddo
Если массивы хранятся в памяти строками, то при изменении параметра
цикла i данные a(i,j) извлекаются с большим шагом (при достаточно
большом N). Тайлинг позволит использовать данные a(i,j) одного блока
кэша, что уменьшит время обращения к памяти.
Заменим цикл по j двумерной циклической конструкцией:
do k=1,N
l(1)=1/a(1,k)
do p = 2,N
l(p)= –a(p,k)
enddo
do j gl = 1, Q2
do j = max(2 + ( j gl – 1)r2 , k +1) , min(1+ j gl r2, N + P),
u(j)=a(1,j)l(1)
do i = 2,N
a(i–1,j)=a(i,j)+l(i)u(j)
enddo
a(N,j)=u(j)
enddo(j)
enddo( j gl )
enddo(k)
8
Здесь r2 характеризует число значений параметров второго цикла двумерной конструкции, Q2   N  P  1 / r2  . Распределим теперь цикл с параметром j между выполняемыми операторами:
do k=1,N
l(1)=1/a(1,k)
do p = 2,N
l(p)= –a(p,k)
enddo
do j gl = 1, Q2
do j = max(2 + ( j gl – 1)r2 , k +1), min(1+ j gl r2, N + P)
u(j)=a(1,j)l(1)
enddo
do i = 2, N
do j = max(2 + ( j gl – 1)r2, k +1), min(1+ j gl r2, N + P)
a(i–1,j)=a(i,j)+l(i)u(j)
enddo
enddo
do j = max(2 + ( j gl – 1)r2, k +1), min(1+ j gl r2, N + P)
a(N,j)=u(j)
enddo
enddo( j gl )
enddo(k)
Теперь локальный цикл по j стал внутренним, что позволяет эффективно использовать кэш.
Пример 6 (ускорение вычислений на многоядерном процессоре).
Основная часть одного из вариантов метода Якоби решения разностной
задачи Дирихле (одномерное уравнение) можно задать следующим гнездом циклов:
do m  1, M
do i  1, Nx  1
U (i, j )  0,3333*( L(i 1)  L(i)  L(i 1,))
enddo
do i  1, Nx  1
L(i, j )  U (i, j )
enddo
enddo
Время выполнения параллельного OpenMP алгоритма на восьмиядерном
9
процессоре с использованием разбиения на тайлы и без использования
разбиения отличается почти в 10 раз [3].
Пример 7 (двухуровневый тайлинг для распараллеливания алгоритмов при программирования общего назначения на графических процессорах). Для реализации алгоритма на графическом процессоре множество
операций алгоритма должно быть разбито на блоки, а блоки – на потоки
(нити) вычислений.
Рассмотрим основную часть алгоритма перемножения матриц:
do i = 1, N1
do j = 1, N2
do k = 1, N3
c(i, j )  c(i, j )  a(i, k )b(k , j )
enddo
enddo
enddo
 N2 
 ) получим
Q
 2
После разбиения цикла по j (Q2 – параметр, r2  
do i = 1, N1
do j gl = 1, Q2
do j = 1 + ( j gl – 1) r2, min( j gl r2, N2)
do k = 1, N3
c(i, j )  c(i, j )  a(i, k )b(k , j )
enddo
enddo
enddo
enddo
Положим, что один блок вычислений Bl(i, j gl ) составляют вычисления
do j = 1 + ( j gl – 1) r2, min( j gl r2, N2)
do k = 1, N3
c(i, j )  c(i, j )  a(i, k )b(k , j )
enddo
enddo
Для разбиения блоков Bl(i, j gl ) вычислений на потоки Thr( j gl 2 ) произведем повторное разбиение (тайлинг уровня 2) цикла по j.
Обозначим через Q2,2 число итераций в новом глобальном цикле с
параметром j gl 2 , а через r2,2 (наибольшее) число значений параметра j в
10
 r2 
.
 Q2,2 
локальном цикле. Параметр Q2,2 задает число потоков в блоке, r2,2  
Вычисления одного блока после разбиения на потоки можно записать в
виде
do j gl 2 = 1, Q2,2
do j=1+( j gl –1)r2+( j gl 2 –1)r2,2, min(( j gl –1)r2+ j gl 2 r2,2, j gl r2, N2)
do k = 1, N3
c(i, j )  c(i, j )  a(i, k )b(k , j )
enddo
enddo
enddo
Один поток вычислений Thr( j gl 2 ) блока Bl(i, j gl ) составляют вычисления
do j=1+( j gl –1)r2+( j gl 2 –1)r2,2, min(( j gl –1)r2+ j gl 2 r2,2, j gl r2, N2)
do k = 1, N3
c(i, j )  c(i, j )  a(i, k )b(k , j )
enddo
enddo
Таким образом, в результате двухуровневого тайлинга получили алгоритм,
множество операций которого разбито на блоки и потоки (нити) вычислений:
do i = 1, N1
do j gl = 1, Q2
Bl(i, j gl )
enddo
enddo
где вычисления одного блока Bl(i, j gl ) есть
do j gl 2 = 1, Q2,2
Thr( j gl 2 )
enddo
Формальная техника тайлинга. Пусть в гнезде циклов имеется 
наборов выполняемых операторов, и в окружении каждого набора есть хотя бы один разбиваемый цикл. Под набором операторов будем понимать
один или несколько операторов, окруженных одним и тем же множеством
циклов. Операторы и наборы операторов линейно упорядочены расположением их в записи алгоритма. Обозначим: V  , 1     , – области изменения параметров циклов, окружающих наборы операторов, n – размерность области V  , число циклов, окружающих  -й набор операторов.
Следующие величины и множества используются для формализации
тайлинга.
11
m 
min
j , M  
max
j , 1    n , – предельные значения
J  j , j , , j V


изменения параметров циклов;
r1  rn – заданные натуральные числа, определяющие размеры
тайла; r обозначает число значений параметра j , приходящихся на один
тайл  -го набора операторов; r может принимать фиксированное значение в пределах от 1 до r ,max включительно, где r ,max  M  m  1 ; если
r  1 , то цикл с параметром j является глобальным неразбиваемым; если
r  r ,max , то цикл с параметром j является локальным неразбиваемым;
если два набора операторов имеют общий цикл с параметром j , то
r  r ;
Q   ( M   m  1) / r  , 1    n , – число частей, на которые при формировании тайлов разбивается область значений параметра j цикла,
окружающего  -й набор операторов;
V  ,gl   J gl ( j1gl  jngl )1  jgl  Q  1    n  , – области изменения параJ j1 , j2 , , j  V

1
n
2
n


1
2

метров глобальных, т.е. уровня тайлов, циклов;

VJgl  J ( j1 jn ) V   m  ( jgl 1)r  j  m  1  jgl r , 1    n  ,
 , gl
, – области изменения параметров локальных (уровня операций
тайлов) циклов при фиксированных значениях параметров глобальных
циклов. Множество операций, выполняемых на итерациях множества VJ ,
будем также обозначать VJ . Множества VJ называются тайлами VJ или
тайлами J gl . Тайлы VJ будем называть тайлами  -го типа.
Опишем структуру многомерного цикла после применения к нему
преобразования тайлинга. Параметры циклов jgl изменяются в соответствии с неравенствами 1  jgl  Q , для каждого набора операторов имеется
столько локальных циклов, сколько r1  rn превосходят единицу. Соответственно этому описанию генерируется код
Отметим, что некоторые множества VJ могут быть пустыми, так как
применяется метод окаймления.
Допустимость тайлинга. Установим необходимые и достаточные
условия, при выполнении которых преобразование тайлинга является корректным.
Пусть имеется некоторая зависимость S ( I )  S  ( J ) . Обозначим через

 и   номера наборов операторов, которым принадлежат S и S  соответственно, а через c   множество общих циклов в окружении операторов
S и S  . Если общих циклов не существует, то положим c    0 .
Теорема 1. Пусть существует хотя бы одна такая зависимость
J V
gl
gl
gl
gl
gl

gl
12
gl


, J  VJ loc , что c    0 . Тайлинг является допустимым тогда и только тогда, когда для любой такой зависимости выполняются следующие условия:
(2)
( j1gl  jcgl ) lex (i1gl  icgl ) ,
S ( I )  S  ( J ) , I  VIgl
loc
gl
α
,β
α
,β
    .
if ( j1gl  jcglα,β)  (i1gl  icglα,β) then
(3)
При отсутствии указанных зависимостей тайлинг допустим.
Действительно, рассматриваемый тайлинг не изменяет порядок выполнения операций в пределах любого фиксированного тайла. Поэтому
необходимо и достаточно установить корректность тайлинга на глобальном уровне (уровне тайлов). Условие (2) устанавливает сохранение зависимостей между итерациями общих глобальных циклов. При тайлинге
может меняться порядок выполнения операций, зависящих от параметров
только общих циклов. Поэтому условие (3) является необходимым и достаточным для сохранения зависимостей в случае совпадения параметров
общих глобальных циклов (в случае ( j1gl  jcgl )  (i1gl  icgl ) ,      зависиα
,β
α
,β
мые операции принадлежат одному тайлу, поэтому тайлинг не нарушает
зависимостей).
Ниже приведены некоторые иллюстрации, демонстрирующие необходимость и достаточность условий (2) и (3).
13
14
Рассмотрим непосредственно следующий из теоремы 1 способ проверки корректности тайлинга.
Для каждой пары итераций I и J, порождающих зависимость между
операциями S ( I )  S  ( J ) :



определить общие циклы;
если c    0 , то зависимость не нарушает корректности тайлинга
(ввиду      );
если c    0 , то определить первые c   глобальные координаты итераций I и J ( I VI

loc

если
c    0 ,
то
( j1gl  jcgl ) lex (i1gl  icgl ) ;
α
,β

, J  VJ

gl
gl
loc
);
проверить
справедливость
условия
α
,β
если c    0 и ( j  jcgl )  (i1gl  icgl ) , то проверить справедливость
gl
1
 
 
условия    (или, что равносильно, проверить справедливость
     ).
Обозначим через c количество общих для операторов S и S  раз 
биваемых циклов,
jk
, 1   c
 
, – параметры этих циклов. Следующее
утверждение устанавливает допустимость тайлинга, применяемого для получения параллельных зернистых последовательностей вычислений.
Теорема 2. Пусть неразбиваемый цикл является глобальным, если
не существует внешнего по отношению к нему разбиваемого цикла, и является локальным, если существует внешний по отношению к нему разбиваемый цикл. Пусть существует хотя бы одна такая зависимость
15
S ( I (i1 in ))  S ( J ( j1 jn )) , что в окружении операторов S и S  имеет-
ся хотя бы один общий разбиваемый цикл и равны параметры всех внешних не разбиваемых циклов: (i1 ik 1 )  ( j1  jk 1 ) , k1  1 . Тайлинг является
допустимым, если для любой такой зависимости выполняются следующие
условия:
jk  ik , 2    c ,
(4)
1

1
 

  .
(5)
При отсутствии указанных зависимостей тайлинг допустим.
Доказательство. При тайлинге (в предположениях теоремы) может
меняться относительно друг друга порядок выполнения операций, зависящих от параметров одних и тех же разбиваемых циклов. Поэтому порядок
выполнения зависимых операций может нарушиться только для таких зависимостей S ( I )  S  ( J ) , что операторы S и S  окружены одним или несколькими общими разбиваемыми циклами и совпадают значения координат векторов I и J , относящиеся к внешним, по отношению к разбиваемым, циклам. Таким образом, следует учитывать только зависимости, указанные в предположениях утверждения.
Покажем, что после применения к исходному многомерному циклу
преобразования тайлинга порядок выполнения зависимых операций не
изменится.
Напомним, что при тайлинге, с точки зрения преобразования циклов,
каждый разбиваемый цикл заменяется на глобальный и локальный циклы,
общие локальные циклы распределяются между циклами каждого набора
операторов, локальные циклы переставляются с глобальными и становятся
по отношению к ним внутренними. Условия (4) являются достаточными
для переставляемости указанных циклов, а условия (5) достаточны для
распределения циклов.
Рассмотрим следующий из теоремы 2 способ проверки корректности
тайлинга.
Для каждой пары итераций I и J, порождающих зависимость между
операциями S ( I )  S  ( J ) :
 определить общие разбиваемые циклы;
 если c  1 , то зависимость не нарушает корректности тайлинга;
 
 если c
 
 2 , то определить все k , 1    c  ;
 если (i1 ik 1 )  ( j1  jk 1 ) , то зависимость не нарушает корректности
тайлинга;
 если (i1 ik 1 )  ( j1  jk 1 ) , то проверить справедливость условий
jk  ik , 2    c , и    (или      ).
1
1
1


1
 
16
Организация параллельных зернистых вычислительных процессов. Рассмотрим способ получения параллельных последовательностей
зернистых (т.е. разбитых на тайлы) вычислений. Каждая последовательность вычислений отождествляется с некоторым упорядоченным множеством операций алгоритма. Если последовательности вычислений можно
выполнять одновременно, то их называют параллельными. Задание параллельных последовательностей зернистых вычислений позволяет организовать параллельные зернистые вычислительные процессы на компьютерах с
распределенной памятью.
Для  -го набор операторов, зафиксируем один из параметров глобальных циклов jgl . Для распределения вычислений между вычислительными процессами будем использовать отображение тайлов на процессы.
Поставим в соответствие тайлам VJ функции вида:
gl


Pr J gl ( j1gl  jngl )    jgl    Q    ,
  {11}   {01}    Z .
К одной последовательности зернистых вычислений, задающей один зернистый вычислительный процесс, отнесем операции тайлов с одинаковыми значениями функций Pr .
Примем, что множество операций любого тайла выполняется за одну
единицу времени, и все результаты и аргументы вычислений одного тайла
в следующий момент времени могут участвовать в вычислениях любого
другого тайла. Последовательности зернистых вычислений назовем параллельными, если асимптотически, т.е. при большом размере задачи и без
учета разгона вычислений (когда еще не все последовательности вычислений начали выполняться) и торможения вычислений (когда еще не все последовательности вычислений закончили выполняться) в каждый момент
времени выполняются операции тайлов всех последовательностей.
Теорема 3. Если для всех наборов циклов выполнено хотя бы одно из
условий:
1) в  -м наборе операторов количество параметров Qi  1, i   больше
либо равно 1 и хотя бы для одного такого параметра выполняется
Qi  Q ;
2) в  -м наборе операторов цикл  параллельный,
и выполняются условия теоремы 1, то зернистые вычислительные
процессы, являются параллельными.
Заключение. Тайлинг – одно из самых часто используемых
преобразований алгоритмов при выполнении как последовательных, так и
параллельных вычислений. Применяется тайлинг для разбиения множества операций алгоритма на макрооперации, называемые зернами вычислений или тайлами. Зернистые вычисления позволяют уменьшить
накладные расходы на использование иерархической памяти при
17
последовательных вычислениях и на организацию обмена данными при
параллельных вычислениях.
Мы ознакомились с основами теории тайлинга, с применением
тайлинга для организации параллельных вычислительных процессов и потоков при программирования на компьютерах с распределенной памятью,
на многоядерных процессорах, на графических процессорах.
Литература
1. Лиходед Н.А. Обобщенный тайлинг // Доклады НАН Беларуси. 2011. Т. 55,
№ 1. С. 16-21.
2. Renganarayanan L., Kim D., Rajopadhye S., Strout M.M. Parameterized tiled
loops for free // ACM SIGPLAN Conference on Programming Language Design and Implementation. San Diego, California, USA , June 2007. P. 126–138.
3. Hartono A., Baskaran M., Ramanujam J., Sadayappan P. DynTile: Parametric tiled
loop generation for parallel execution on multicore processors. // Proceedings of 24th International Parallel and Distributed Processing Symposium, Atlanta, April 2010. P.1–12.
4. Tavarageri S., Hartono A., Baskaran M., Pouchet L.-N., Ramanujam J., Sadayappan, P. Parametric tiling of affine loop nests // Proc. 15th Workshop on Compilers for
Parallel Computers. Vienna, Austria, July 2010.
5. Kim D., Rajopadhye S. Parameterized tiling for imperfectly nested loops. // Technical Report CS-09-101, Colorado State University, Department of Computer Science, February 2009.
6. Лиходед Н.А., Толстиков А.А. Параллельные последовательности зернистых
вычислений // Доклады НАН Беларуси. 2010. Т. 54, № 4. С. 36-41.
18
Download