Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[211]

30.2. CRCW- и EREW-алгоритмы

Одновременный доступ к памяти в параллельных компьютерах имеет свои плюсы и минусы. Недостатком является сложность аппаратной поддержки такого доступа. Кроме того, возможности одновременного доступа используются не так часто. С другой стороны, в некоторых случаях без этих возможностей трудно обойтись. На практике часто выбирается один из промежуточных вариантов.

В этом разделе рассматриваются преимущества одновременного доступа. Существуют задачи, для которых наилучший CRCW-алгоритм работает быстрее наилучшего EREW-алгоритма. Такова, например, задача отыскания корней деревьев в графе, являющемся лесом, а также задача поиска максимального элемента в массиве. Эти задачи рассмотрены ниже.

30.2.1. Польза параллельного чтения

Пусть дано несколько двоичных деревьев, заданных следующим образом: каждая вершина г имеет указатель parent[i] на родителя (если вершина является корнем, то parent[i] = nil). Требуется для каждой вершины г найти корень гоо£[г] дерева, которому она принадлежит. С каждой вершиной мы связываем один процессор.

Find-Roots(F)

1for (для) каждого процессора г

2do if parent[i] = nil

3then гоо£[г] <- г

4while существует узел г, для которого parent[i] ф nil

5do for (для) каждого процессора г

6do if parent[i] ф nil

7then гоо£[г] <- root[parent[i]]

8parent[i] <- parent[parent[i]]

Работа алгоритма показана на рис. 30.5. После инициализации (строки 1-3) корни известны только для корневых вершин (рис. 30.5 (а)). В цикле while (строки 4-8) происходят переходы по указателям и заполняются поля root у вершин следующих (по глубине) уровней. На рис. 30.5 (b)-(d) показаны состояния деревьев после первого, второго и третьего выполнений цикла. Цикл имеет следующий инвариант: после t повторений цикла либо parent[i] = nil и гоо£[г] содержит правильный указатель на корень, либо parent[i] есть предок на расстоянии 2*.

Алгоритм Find-Roots можно реализовать на CREW-машине; время работы составляет О (lg cf), где d - максимальная из глубин деревьев. Действительно, все записи являются исключающими - каждый процессор производит запись только в поля своей вер-


Рис. 30.5 30.5. CREW-алгоритм нахождения корней деревьев. Номера вершин расположены рядом с ними. Внутри вершин показаны значения root. Стрелки обозначают ссылки parent, (a)-(d) Состояние дерева перед каждым выполнением цикла while (строки 4-8). Заметим, что максимальная длина пути по стрелкам на каждом шаге уменьшается вдвое.

шины. Однако чтение в строках 7 и 8 является одновременным, поскольку одна вершина может быть предком сразу для нескольких других. Например, на рис. 30.5 (Ь) при втором выполнении цикла значения гоо£[4] и parent[4] читаются процессорами 18, 2 и 7 одновременно.

Время работы составляет 0(lg d) по тем же причинам, что и для алгоритма List-Rank.

Пусть теперь одновременное чтение запрещено. Тогда можно показать, что не существует алгоритма со временем работы меньше fi(lgn) (где п - общее количество вершин). Причина тут в том, что на каждом шаге число вершин, которые знают свой корень, увеличивается не более чем вдвое, поэтому требуется Q(lgn) шагов (для леса из одного дерева).

Если максимальная высота деревьев мала, то алгоритм FlND-Roots работает асимптотически быстрее, чем любой EREW-алгоритм. Например, при высоте дерева d = O(lgra) (пусть, скажем, имеется всего одно полное дерево), CREW-алгоритм работает за время О (lg lg тг), а любой EREW-алгоритм требует времени O(lgn).

Другой (более простой) пример выигрыша от параллельного чтения см. в упр. 30.2-1.

30.2.2. Польза параллельной записи

Рассмотрим задачу о нахождении максимального элемента в массиве из п действительных чисел. Можно доказать, что для этой задачи наилучший EREW-алгоритм требует времени Q(lgn) и что одновременное чтение не позволяет уменьшить время работы. Однако существует CRCW-алгоритм со временем работы 0(1). Напомним, что мы рассматриваем CRCW-модель, в которой все процессоры, производящие запись в данную ячейку, должны записывать туда одно и то же.

Пусть А[0 .. .п - 1] - входной массив. Наш CRCW-алгоритм использует п2 процессоров. Каждый процессор сравнивает какие-то два элемента A[i] и A[j], где 0 i,j п - 1, и нумеруется парой индексов

Fast-Max(A)

1п <- length[A]

2for г <- 0 to п - 1


Рис. 30.6 30.6. Отыскание максимума в массиве за время O(l) с помощью алгоритма Fast-Max. Для каждой (упорядоченной) парыэлементов массива А = (5, 6, 9, 2, 9} в таблице показан результат сравнения А[г] < A[j] (Т означает true, F - false). Если в строке есть хотя бы одна буква Т, то соответствующий элемент т равен false, иначе - true. Элементы массива, для которых в столбце т стоит значение true, являются максимальными (и записываются в ячейку max).

10 return max

В строке 1 определяется длина массива А (каким-то из процессоров). В строках 2-3 каждым элементом массива т занимается какой-то один процессор (их у нас достаточно - га2) и помещает туда значение TRUE. (Будущий смысл массива т таков: m[i] истинно, когда A[i] - максимальный элемент в массиве).

Дальнейшая работа алгоритма показана на рис. 30.6. В строках 4-6 происходит сравнение всех возможных пар A[i] и A[j]. Если A[i] < A[j], то A[i] не может быть максимальным элементом, поэтому мы записываем в га [г] значение FALSE (строка 6). Несколько различных процессоров могут одновременно производить запись в ячейку га [г], но все они записывают одно и то же значение - FALSE.

Таким образом, после выполнения строк 4-6 га [г] истинно для тех и только тех индексов г, для которых А [г] - максимальный элемент. В строках 7-9 максимальное значение помещается в переменную max, которая является выходным значением (строка 10). К переменной max могут обращаться сразу несколько процессоров, но все они присваивают ей одно и то же значение, как и требуется в модели одновременной записи общего значения.

Поскольку выполнение каждого из циклов занимает время 0(1) (все процессоры работают одновременно), общее время работы алгоритма составляет 0(1). Алгоритм не является эффективным по затратам: общие затраты составляют га2 -0(1) = О (га2), а простейший однопроцессорный алгоритм работает за время в (га). Более эффективный алгоритм рассматривается в упражнении 30.2-6.

В сущности, алгоритм поиска максимума основан на возможности вычислить логическое И от га аргументов за время 0(1) при наличии га процессоров в модели с одновременной записью общего значения (и в других, более мощных CRCW-моделях). Фактически



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]