Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы решения систем линейных уравнений с блочно-ленточными матрицами. Монография
.pdf
Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 5 121
Итерационный алгоритм решения может быть записан на языке С,
совпадает с алгоритмом Гаусса-Зейделя для двумерной задачи Дирихле и имеет вид
for (t=1; t < Itera+1; t=t+1){
for (i=1; i < M; i=i+1){
for (j=1; j < N; j=j+1){
X[i][j]= ¼*X[i-1][j]+ ¼*X[i][j-1]
+ ¼*X[i+1][j]+ ¼*X[i][j+1];
}}}
Здесь X определено на целых точках множества [0, M + 1]*[0, N + 1].
При этом на границе данного прямоугольника X принимает некоторые (граничные) значения, а внутри прямоугольника вначале обычно X равно нулю X[i ][j] = 0, i = 1, ..., M; j = 1, ..., N.
Если массив X[i][j ] представить одномерным массивом xx[k], то на
псевдокоде этот алгоритм примет вид
for (t = 1; t < Itera + 1; t = t + 1){
xx = B*xx + hh;
}
Вектор hh размера (M+ 2)*(N+2) такой, что hh [0] = 0; hh[j] = X [0][j];
j = 1, 2, …, N ; hh [N + 1] = 0; hh [k] = X[i ][j], если k = M*i + j , где
i = 1, 2, …, M ; j = 1, 2, …, N.
Конец примера.

122 Б. Я. Штейнберг, О. Б. Штейнберг
6. ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ
ДЛЯ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ
С РАСПРЕДЕЛЕННОЙ ПАМЯТЬЮ
У перспективных высокопроизводительных микросхем вычислительные ядра могут иметь локальную адресуемую память на микросхеме. Такие
микросхемы иногда называют «суперкомпьютер на кристалле». У таких
микросхем пересылки данных между процессорными ядрами осуществляются по коммуникационным сетям на микросхеме и отношение времени
таких пересылок ко времени выполнения арифметических операций не так
велико, как на высокопроизводительных кластерах [73].
В данной главе содержится информация о некоторых общих принципах
разработки программ для ВС с распределенной памятью.
6.1. Блочно-аффинные размещения массивов
в распределенной памяти
Размещение массива в распределенной памяти — это функция, которая
для каждого элемента массива указывает номер ПЭ, в котором этот элемент
находится. Будем рассматривать блочно-аффинные размещения массивов в
распределенной памяти [25]. К таким размещениям сводится большинство
известных используемых размещений: «по строкам», «по столбцам», «по
полосам строк», «по полосам столбцов», «по скошенным диагоналям» и др.
Не следует путать блоки массивов, которые размещаются в распределенной памяти, с блоками блочно-ленточной матрицы. Эти блоки могут
совпадать, но может один блок, размещенный в ПЭ, содержать несколько
блоков матрицы, и наоборот, один блок матрицы может быть разбит на несколько блоков, которые размещаются в разных модулях памяти.
Основная особенность параллельного выполнения цикла на ВС с распределенной памятью состоит в том, что для каждой операции ее аргументы должны быть в одном модуле распределенной памяти.
Будем полагать, что все ПЭ занумерованы начиная с нуля.
Блочно-аффинным по модулю p размещением m-мерного массива X
(см.: [25]) называется такое размещение, при котором элемент X[i1, i2, ..., im]
находится в модуле памяти с номером
u = (]s1/d1[*i1 + ]s2/d2[*i2 + ... + ]sm/dm[*im + s0) mod p.

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 6 123
Здесь натуральные (включая ноль) числа p, d1, d2, …, dm и целые кон-
станты s0, s1, s2, sm зависят только от m-мерного массива X.
Число s0 будем называть сдвигом массива X. Это число показывает но-
мер модуля памяти, в котором размещается нулевой элемент X(0, 0, …, 0).
При описанном блочно-аффинном способе размещения m-мерный мас-
сив представляется как массив блоков размерности d1*d2 *…* dm, который
размещается так, что у каждого блока все элементы оказываются в одном
модуле памяти.
Числа p, d1, d2, …, dm , s0, s1, s2, ..., sm будем называть параметрами
размещения.
Пример 56. Рассмотрим размещение элементов массива X[i, j] при
p = 4, d1 = 1, d2 = 1, s0 = 3, s1 = 1, s2 = 0.
Массив представлен 4-мя столбцами элементов, лежащих в соответ-
ствующих 4 ПЭ.
ПЭ0ПЭ1ПЭ2ПЭ3
X[0,0]
X[1,0] X[2,0] X[3,0] X[4,0]
X[5,0] X[6,0] ...
X[0,1]
X[1,1] X[2,1] X[3,1] X[4,1]
X[5,1] X[6,1] ...
X[0,2]
X[1,2] X[2,2] X[3,2] X[4,2]
X[5,2] X[6,2] ...
Конец примера.
Пример 57. Рассмотрим размещение элементов массива X[i, j ] при
p = 4, d1 = 1, d2 = 2, s0 = 0, s1 = 0, s2 = 1.
Массив представлен 4-мя столбцами элементов, лежащих в соответ-
ствующих 4 ПЭ.
ПЭ0ПЭ1ПЭ2ПЭ3
X[0,0] X[0,2] X[0,4] X[0,6]
X[0,1] X[0,3] X[0,5] X[0,7]
X[0,8] X[0,10] X[0,12] X[0,14]
X[0,9] X[0,11] X[0,13] X[0,15]
X[0,16]
X[0,17]

124 Б. Я. Штейнберг, О. Б. Штейнберг
...
X[1,0] X[1,2] X[1,4] X[1,6]
X[1,1] X[1,3] X[1,5] X[1,7]
X[1,8] X[1,10] X[1,12] X[1,14]
X[1,9] X[1,11] X[1,13] X[1,15]
X[1,16]
X[1,17]
Конец примера.
Пример 58. Рассмотрим размещение матрицы X[1000][2000]: int;
размера 100*200 в 16 ПЭ, соответствующее описанию: X<16; 4, 12;
0; 1, 0>. В матрице выделим блоки размера 4*12. Блочные строки
матрицы целиком лежат в соответствующих ПЭ (это означает, что ВС
может одновременно обращаться к блокам одного столбца). Блочная строка с номером 0 лежит в ПЭ с номером 0.
Конец примера.
Пример 59. Рассмотрим программу, вычисляющую результат фильтрации сигнала.
for (j = 1; j < N+1; j++) {
Y[j] = (X[j-1]+X[j]+X[j+1])/3; (19)
}
Чтобы выполнять этот цикл параллельно, можно сделать преобразование «гнездование цикла» (полагаем, что N делится нацело на p):
for (j1 = 1; j1 < p+1; j1++) {
for (j2 = 1; j2 < N/p + 1; j2++){
j = (j1–1)*p + j2;
Y[j] = (X[j-1]+X[j]+X[j+1])/3;
}}
Для данного примера массивы Y и X естественно размещаются
блочно-аффинно с параметрами d = N/p, s1=1, s0=0. Для каждого
k = 1, 2, …, (p – 1) вычисления элементов Y[k*N/p –1] и Y[k *N/p] требуют из соседнего ПЭ переслать элементы X[k *N/p] и X[k*N/p–1]
соответственно. Вычисление цикла (19) станет неоднородным —
в начале и конце.
Конец примера.

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 6 125
Пример 60. Рассмотрим программу решения одномерной задачи те-
плопроводности о нагревании (охлаждении) стержня. Заметим, что
матрица, соответствующая этому преобразованию, ленточная.
for (t = 1; t < N+1; t++) { //////////////// итерации
for (j = 1; j < N+1; j++) {
Y[j] = (X[j-1]+X[j]+X[j+1])/3;
}
for (j = 1; j < N+1; j++) {
X[j] = (Y[j-1]+Y[j]+Y[j+1])/3;
}}
Чтобы выполнять этот цикл параллельно на p ПЭ, можно для внутренних циклов сделать преобразование «гнездование цикла» (полагаем, что N делится нацело на p):
for (t = 1; t < N+1; t++) { //////////////// итерации
for (j1 = 1; j1 < p+1; j1++) {
for (j2 = 1; j2 < N/p+1; j2++) {
j = (j1–1)*p + j2;
Y[j] = (X[j-1]+X[j]+X[j+1])/3;
}}
for (j1 = 1; j1 < p+1; j1++) {
for (j2 = 1; j2 < N/p+1; j2++) {
j = (j1–1)*p + j2;
Y[j] = (X[j-1]+X[j]+X[j+1])/3;
}}
Для параллельного выполнения на p ПЭ естественно разместить
массивы Y и X блочно-аффинно с параметрами d = N/p, s1 = 1,
s0 = 0. Для каждого k = 1, 2, …, (p – 1) вычисления элементов
Y[k*N/p–1] и Y[k*N/p] требуют из соседнего ПЭ переслать элементы
X[k*N/p] и X[k*N/p–1] соответственно. Вычисление цикла (19) станет
неоднородным — в начале и конце. Аналогично, для вычисления
X[k*N/p–1] и X[k*N/p].
Конец примера.

126 Б. Я. Штейнберг, О. Б. Штейнберг
6.2. Межпроцессорные пересылки данных
Будем рассматривать коммуникационные сети «шину» и «кольцо», позволяющие пересылать одновременно одно данное из каждого ПЭ к соседнему справа или одновременно из каждого ПЭ к соседнему слева.
Шина и кольцо позволяют выполнять межпроцессорные пересылки
«кольцевые сдвиги», которые описываются циклическими подстановками.
Подстановка s показывает, что во время пересылки из каждого ПЭ с номером i пересылается данное в ПЭ с номером s(i). Циклическая подстановка обладает свойством: для каждого I выполняется s(i)–I = C mod p. Для
бесконечного количества ПЭ выполняется s(i)–I = C. Здесь константа C
показывает, через сколько ПЭ по сети следует пересылать данные.
В данной статье будем рассматривать только циклические пересылки.
К таким пересылкам данных сводятся параллельные алгоритмы для многих
задач линейной алгебры и численных методов решения задач математической
физики [19; 20]. Актуальность именно таких пересылок для ВС близкого будущего подчеркивается в [35]. Сложные пересылки в многомерных массивах
рассматривались в [25]. Преобразование программного цикла к параллельно
выполняемому виду с минимизацией пересылок рассматривалась в [51].
6.3. Оптимальное количество процессорных
элементов при параллельном вычислении массивов
данных рекуррентным программным циклом
Будем рассматривать рекуррентный программный цикл, в котором вычисляются элементы некоторого массива X:
for (i = 1; i < N; i++) {
x
= Gi(X
i
i–1
);
}
Здесь G
жества ∆. Если отображения Gi(x
, i = 1, ..., N — отображения из некоторого N-рекуррентного мно-
i
) аффинные, вычисление данного про-
i – 1
граммного цикла равносильно решению СЛАУ с треугольной блочно-ленточной матрицей. Если, в частности, m = 1, Gi(Y) = Y + Ai, то рассматриваемый
цикл для каждого k = 1, ..., N вычисляет суммы чисел Ai, i = 1, ..., k. В общем
случае отображения Gi(x
) могут быть нелинейными, лишь бы принадле-
i – 1
жали некоторому N-рекуррентному множеству. Для вычисления этого цикла
воспользуемся следующим алгоритмом.

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 6 127
* /2N Ta T
1. В каждом ПЭ с номером k вычисляем следующие ]N/p[ суперпозиции
отображений Hki = G
k*]N/p[–i+1
◦ ... ◦ G
(k – 1)*]N/p[+1
. Такое вычисление потребует
(]N/p[–1)*Ta времени, где Ta — время вычисления отображения GI(X) от
элемента данных X.
2. Вычисляем все суперпозиции:
W1 = H
11
W2 = H21 ◦ H
11
......
Wk = Hk1 ◦ ... ◦ H21 ◦ H
11
............
Wn = Hn1 ◦ ... ◦ H21 ◦ H
11
Такое вычисление можно выполнить за log2p шагов, на каждом из которых вычисляется одна операция суперпозиции и выполняется одна межпроцессорная пересылка отображения Hk1. Для m-мерной решетки потребуется
m
log2p*(Ta + T1) + T2*k*(
p
– 1) тактов и, в частности, для кольцевой ком-
мутационной сети — log2p *(Ta + T1) + T2*(p – 1) тактов.
3. За 1 шаг одновременно в каждом ПЭ с номером k вычисляем Wk(X(0)).
Это отнимет Tb времени.
4. Одновременно за ]N/p[ шагов в каждом ПЭ с номером k вычисляем
значения отображений Gi(Wk(X(0))) для всех тех индексов i, для которых G
находится в этом ПЭ, что потребует ]N/p[*Tb времени.
Итак, для параллельной ВС с m-мерной решеткой время работы оцени-
вается величиной
m
F(p) = (]N/p[–1)*Ta + log(p)*(Ta + T1) + m*(
= ]N/p[ *(Ta + Tb) + log (p)*(Ta + T1) + m*(
p
– 1)*T2+(]N/p[+1)*Tb =
m
p
– 1)*T2+(Tb – Ta),
при этом оптимальное количество ПЭ вычисляется из уравнения
1+1/m
*T2 + p*(Ta + T1)/ln(2) – N*(Ta + Tb) = 0.
p
Рассматриваемое уравнение подстановкой y = p
–1/m
можно свести к
полиномиальному
m+1
y
*N*(Ta + Tb)–y*(Ta + T1)/ln(2) – T2 = 0.
В частности, для ВС с кольцевой сетью время оценивается величиной
F(p) = ]N/p[*(Ta + Tb) + log(p)*(Ta + T1)+(p – 1)*T2+(Tb – Ta),
оптимальное количество ПЭ равно
p = (–(Ta + T1) +
( 1) 4 *( )* 2*ln2Ta T N Ta Tb T++ +
~
.
/(2*T2*ln2) ~

128 Б. Я. Штейнберг, О. Б. Штейнберг
N
2/T Ta
и минимальное время работы равно
*((Ta + Tb)*
2/T Ta
+
) + ln(N)*(Ta + T1)/2 + (Ta + T1)/2*
ln(Ta/T2) – T2+Tb – Ta.
6.4. Изменение ускорения многопроцессорной
вычислительной системы при повышении
быстродействия процессоров
В данном параграфе приводятся рассуждения, ориентированные на ВС
с распределенной памятью. Но эти же рассуждения применимы ко многим
ВС с общей памятью, поскольку на многих процессорах у каждого вычислительного ядра есть своя L2-cache память и обмены результатами вычислений этих ядер дольше, чем взятие данных из своей кэш-памяти.
Одна из основных общепринятых характеристик параллельных алгоритмов — это ускорение. Ускорение параллельного алгоритма — это отношение времени последовательного исполнения кода ко времени параллельного исполнения. Данное определение не очень корректно, поскольку
не всегда ясно, о каком последовательном алгоритме идет речь. Например,
параллельная прогонка соответствует скорее последовательному методу
редукции, чем методу прогонки. Иногда делаются оговорки о самом быстром последовательном алгоритме. Но такой алгоритм для большинства
задач науке не известен [74]. Да и как учитывать то, что при выполнении
последовательной программы на современном процессоре могут совмещаться, например, вычисления и обращения к памяти. Таким образом,
понятие ускорения не очень корректно, но будем пользоваться тем, какое
есть. В рамках многих задач по оценке производительности параллельных
вычислительных систем это определение вполне полезно.
Пусть имеется МВС с p процессорными элементами и пусть при решении некоторой задачи на этой МВС все процессоры одинаково загружены
и достигается ускорение u. Предположим, что в данной системе заменили
процессоры на новые, которые быстрее старых в k раз. Вычислим, как изменится ускорение системы.
Время решения задачи можно представить следующей формулой:
T(p) = T
transf
(p) + T
calc
(p),

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 6 129
где T(p) — время решения задачи, T
ресылки данных, T
(p) — время, затрачиваемое на вычисления операций:
calc
(p) — время, затрачиваемое на пе-
transf
арифметических, логических, обращения к своей локальной памяти. После
замены процессоров время решения задачи (с соответствующими обозначениями) будет
T
(p) = T
new
new-transf
(p) + T
new-calc
(p).
При этом
T
new-calc
T
new-transf
(p) = T
(p) = T
calc
transf
(p)/k,
(p).
Заметим, что
T(1) = T
calc
(1) = T
calc
(p)*p.
Поскольку ускорение в исходной системе u, можно записать
u = T(1)/T(p) = T
(p)*p/T(p) = p*T
calc
calc
(p)/(T
transf
(p) + T
calc
(p)).
Отсюда находим:
T
(p) = (p – u)*T
transf
calc
(p).
Теперь получим формулу для нового времени работы вычислительной
системы:
T
(p) = T
new
= (p – u)*T
new-transf
(p) + T
calc
(p) + T
calc
(p) = T
new-calc
(p)/k = T
(p) + T
transf
(p)*(1/k + p – u)
calc
(p)/k =
calc
и вычислим новое ускорение:
u
= T
new
new
(1)/T
(p)=p*T
new
new-calc
(p)/T
(p)=p*(T
new
(p)/k)/(T
calc
calc
(p)*
*(1/k + p – u)) = p/(1 + k *(p – u)) = 1/(1/p + k*(1 – u /p)).
Пример 61. Если u = p, то независимо от величины k ускорение оста-
нется прежним u
new
= p.
Конец примера.
Пример 62. Если p = 10, u = 8 и k = 2, то u
= p / (1 + k*(p – u)) = 2,
new
т. е. в данном примере ускорение снизилось в 4 раза.
Конец примера.
Пример 63. Если p = 10, u = 5 и k = 2, то u
= p / (1 + k*(p – u)) = 10/11,
new
т. е. в данном примере ускорение снизилось в 5 раз.
Конец примера.

ЗАКЛЮЧЕНИЕ
Блочно-ленточные матрицы большой размерности возникают при решении многих задач математического моделирования, обработки сигналов и
изображений и др. Повышение быстродействия решения таких задач востребовано во многих прикладных исследованиях.
В данной работе представлены параллельные алгоритмы вычисления
рекуррентных циклов, которые демонстрируют высокое ускорение на процессорах с количеством вычислительных ядер 8 и 32. В работе представлены алгоритмы распараллеливания рекуррентных циклов, которые могут
показать высокое ускорение на перспективных системах на кристалле, имеющих тысячи вычислительных ядер. Такие системы на кристалле иногда
называют «суперкомпьютер на кристалле». Для создания ПО для таких
микро схем перспективными представляются алгоритмы распараллеливания на распределенную память.
В данной работе представлены методы преобразования некоторых блочноленточных матриц к виду, допускающему ускорение за счет сочетания распараллеливания и скошенного тайлинга, дающие ускорение в десятки раз.
В представленной монографии демонстрируется взаимная сводимость
задач решения СЛАУ с блочной двухдиагональной матрицей и вычисления рекуррентного программного цикла. Кроме того, демонстрируется
взаимная сводимость вычисления гнезд циклов итерационного типа и итерационных алгоритмов некоторых задач линейной алгебры. Этим самым
обозначено новое направление на стыке математики и информационных
технологий: анализ и преобразования программ, выполняющих аффинные вычисления с данными. Суть этого раздела теории преобразования
программ в том, что множество данных, с которыми работает программа,
конечно, а всякие линейные преобразования данных эквивалентны матричным преобразованиям; соответственно, аффинные преобразования
данных — это матричные преобразования с прибавлениями константных
векторов (данных). В данной монографии развивается подход, позволяющий к анализу и преобразованиям программ применять методы линейной
алгебры, а к методам линейной алгебры применять соответствующие методы теории преобразования программ. Актуальным и первоочередным
шагом в этом направлении является преобразование блочно-ленточных
матриц, получаемых МКЭ (методом конечных элементов) к виду, допускающему применение сочетания скошенного тайлинга и распараллеливания.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
