Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмы решения систем линейных уравнений с блочно-ленточными матрицами. Монография

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 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. В работе представ­лены алгоритмы распараллеливания рекуррентных циклов, которые могут показать высокое ускорение на перспективных системах на кристалле, име­ющих тысячи вычислительных ядер. Такие системы на кристалле иногда называют «суперкомпьютер на кристалле». Для создания ПО для таких микро схем перспективными представляются алгоритмы распараллелива­ния на распределенную память.
В данной работе представлены методы преобразования некоторых блочно­ленточных матриц к виду, допускающему ускорение за счет сочетания распа­раллеливания и скошенного тайлинга, дающие ускорение в десятки раз.
В представленной монографии демонстрируется взаимная сводимость задач решения СЛАУ с блочной двухдиагональной матрицей и вычисле­ния рекуррентного программного цикла. Кроме того, демонстрируется взаимная сводимость вычисления гнезд циклов итерационного типа и ите­рационных алгоритмов некоторых задач линейной алгебры. Этим самым обозначено новое направление на стыке математики и информационных технологий: анализ и преобразования программ, выполняющих аффин­ные вычисления с данными. Суть этого раздела теории преобразования программ в том, что множество данных, с которыми работает программа, конечно, а всякие линейные преобразования данных эквивалентны ма­тричным преобразованиям; соответственно, аффинные преобразования данных — это матричные преобразования с прибавлениями константных векторов (данных). В данной монографии развивается подход, позволяю­щий к анализу и преобразованиям программ применять методы линейной алгебры, а к методам линейной алгебры применять соответствующие ме­тоды теории преобразования программ. Актуальным и первоочередным шагом в этом направлении является преобразование блочно-ленточных матриц, получаемых МКЭ (методом конечных элементов) к виду, допуска­ющему применение сочетания скошенного тайлинга и распараллеливания.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]