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


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




[208]

пись (хотя бы одно из двух) предназначены для CRCW-машины. Мы вернёмся к сравнению различных моделей в в разделе 30.2.

При рассмотрении одновременной записи следует уточнить, что будет находиться в ячейке после записи. В этой главе используется модель одновременной записи общего значения (common-CRCW model), в которой все процессоры, производящие запись в данную ячейку, обязаны записывать туда одно и то же значение. В литературе встречаются и другие модели:

•произвольный выбор (arbitrary): сохраняется одно (произвольное) значение из записываемых;

•приоритеты (priority): сохраняется значение, поступившее от процессора с наименьшим номером;

•комбинация (combinational): сохраняется некоторая комбинация (например, сумма или максимум) поступивших на запись значений.

В последнем случае сохраняемое значение обычно является коммутативной и ассоциативной функцией значений, поступающих на запись.

30.0.3. Синхронизация

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

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

30.0.4. План главы

В разделе 30.1 рассматривается метод переходов по указателям и его использование для обработки префиксов списка, а также ана-


логичные методы для работы с деревьями. Раздел 30.2 посвящен сравнению CRCW- и EREW-машин и преимуществам одновременного доступа к памяти.

В разделе 30.3 доказывается теорема Брента о моделировании схем из функциональных элементов в модели PRAM. Кроме этого, в этом разделе рассматривается понятие эффективности по затратам и даются условия, при которых число процессоров может быть уменьшено без потери эффективности. В разделе 30.4 вновь рассматривается задача обработки префиксов списка и описывается эффективный по затратам вероятностный алгоритм для этой задачи. Наконец, раздел 30.5 посвящен задаче о нарушении симметрии. Приводится детерминированный алгоритм, который позволяет решить эту задачу за время, существенно меньшее логарифмического.

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

30.1. Переходы по указателям

В этом разделе рассматривается метод переходов по указателям - важное средство для построения параллельных алгоритмов обработки списков. С помощью этого метода строится алгоритм, позволяющий за время О (lgra) найти положение в списке (расстояние до конца списка) для всех элементов списка длиной га. Похожий алгоритм используется для параллельной обработки префиксов списка длиной га за время О (lgra). Мы укажем также способ, позволяющий сводить многие задачи о деревьях к задачам о списках, решаемым с помощью переходов по указателям. Все алгоритмы в этом разделе не требуют одновременного доступа к памяти и потому могут быть реализованы на EREW-машине.

30.1.1. Номер в списке

Список в PRAM-машине хранится обычным образом. При этом мы будем считать, что за каждый элемент списка отвечает свой процессор, то есть что г-ый процессор отвечает за элемент списка, хранящийся в г-ой ячейке памяти. (Порядковый номер этого элемента в списке может быть любым.) На рис. 30.2(a) показан пример списка из объектов (3,4,6,0,1,5). Поскольку для каждого элемента имеется собственный процессор, все элементы списка можно обрабатывать параллельно.

Пусть дан односторонне связанный список L из га элементов, и


Рис. 30.2 30.2. Использование метода переходов по указателям для вычисления расстояний до конца списка за время O(lgn). (а). Начальное состояние: все значения d равны 1. (b)-(d). Состояния списка после каждого выполнения цикла while в алгоритме List-Rank. В конце значение d совпадает с расстоянием до конца списка.

для каждого его элемента требуется найти расстояние до конца списка. Более формально, если next[i] - указатель объекта г на следующий объект, то расстояние до конца списка задаётся индуктивно следующим образом:

ГОесли next[i] = nil

L i у d[next[i]] + 1 если next[i] ф nil

Эта задача называется задачей о номере в списке (list-ranking problem).

Тривиальное решение состоит в вычислении расстояний последовательно, начиная с конца списка. При этом время работы составляет в (га), поскольку k-ъ с конца объект может быть обработан лишь после к - 1 следующих за ним объектов. Такое решение по сути является последовательным, а не параллельным - в каждый момент активен только один процессор. Рассмотрим теперь алгоритм с временем работы в (lgra).

List-Rank(L)

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

2do if next[i] = nil

3then d[i] f- 0

4else d[i] <- 1

5while существует объект i, для которого next[i] ф nil

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

7do if next[i] ф nil

8then d[i] <- d[i] + с?[пеж£[г]]

9next[i] <- next[next[i]]

На рис. 30.2 показаны состояния списка перед каждым повторением цикла while в строках 5-9. Состояние списка после заполнения полей d[i] (строки 1-4) показано на рис. 30.2(a). На первом шаге у всех объектов, кроме последнего, указатели не равны nil, поэтому строки 8-9 выполняются для первых пяти процессоров. Получается состояние списка, показанное на рис. 30-2(Ь). На следующем шаге строки 8-9 выполняются только для первых четырёх процессоров (у двух последних объектов указатели уже равны nil). Результат показан на рис. 30-2(с). При третьем (и последнем) выполнении цикла работают только два первых процессора. Конечный результат показан на рис. 30-2(d).

Идея композиции переходов по указателям (pointer jumping) реализована в строке 9, где производится операция next[i] <- next[next[i]]. Заметьте, что эти действия нарушают структуру



[стр.Начало] [стр.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]