Как быстро может «найти максимум в массиве»? - PullRequest
7 голосов
/ 23 декабря 2011

Этот вопрос возник из обсуждения, которое было затронуто по другому вопросу: Распараллелить уже линейно-временной алгоритм .Это , а не домашнее задание.

Вам предоставляется массив из N чисел и машина с P процессорами и общей CREW памятью (одновременное чтение, эксклюзивная запись в память).).

Что такое самая тесная верхняя граница в алгоритме самый быстрый , чтобы найти наибольшее число в массиве?[Очевидно, также: что такое сам алгоритм?]

Я не имею в виду общий объем выполненной работы [который может никогда быть меньше, чем O (N)].

Ответы [ 5 ]

8 голосов
/ 23 декабря 2011

Я думаю, что это O(N/P') + O(Log2(P')), где P'=min{N,P}. P' процессоры ищут max из N/P' элементов каждый, за которыми следуют Log2 парные объединения, выполняемые параллельно. Первые слияния P'/2 выполняются процессорами с четными номерами, затем 'P' / 4 '- процессорами в местах, кратных 8, затем на 16 и т. Д.

Edit P' введен для того, чтобы охватить случай, когда у вас значительно больше процессорных узлов, чем элементов, которые вам нужно искать.

5 голосов
/ 23 декабря 2011

Cook, Dwork и Reischuk показали, что любой алгоритм CREW для нахождения максимума n элементов должен выполняться за время Omega (lg n), даже с неограниченным числом процессоров и неограниченным объемом памяти. Если я правильно помню, алгоритм с соответствующей верхней границей появляется в их статье:

Стивен Кук, Синтия Дворк и Рюдигер Рейшук. Верхние и нижние временные границы для машин с параллельным произвольным доступом без одновременной записи. SIAM Journal of Computing, 15 (1): 87-97, 1986.

4 голосов
/ 24 декабря 2011

Оптимальным является следующее значение:

Если p <= n / log n, вы можете сделать это за O (n / p) время; в противном случае это O (log n), т.е. когда p> n / log n, вы ничего не получите по сравнению с p = n / log n.

Доказательство - нижняя граница:

Утверждение 1. Вы никогда не сможете сделать быстрее, чем Ω (n / p), потому что процессоры p могут дать только ускорение p

Утверждение 2: Вы не можете делать быстрее, чем Ω (log n), из-за модели CREW (см. Статью о непрощенном) если вы хотите проверить, имеет ли массив 0-1 хотя бы один 1, вам нужно время O (log n).

Доказательство - верхняя граница:

Утверждение 3: Вы можете найти максимум, используя n / log n процессоров и за время O (log n)

Доказательство: легко найти максимум с помощью n процессоров и зарегистрировать n времени; но на самом деле в этом алгоритме большинство процессоров большую часть времени бездействуют; подходящим ласточкиным хвостом (см., например, книгу о сложностях Пападимитриу) их число можно уменьшить до n / log n.


Теперь, имея менее n / log n процессоров, вы можете отдать работу, назначенную K процессорам, одному процессору, это делит требования к процессору на K и умножает требуемое время на K.

Пусть K = (n / log n) / p; предыдущий алгоритм выполняется за время O (K log n) = O (n / p) и требует n / (log n * K) = p процессоров.


Отредактировано: я только что понял, что когда p <= n / log n, алгоритм dasblinkenlight имеет ту же асимптотическую среду выполнения: </p>

n / p + log p <= n / p + log (n / log n) <= n / p + log n <= n / p + n / p <= 2n / p = O (n / p ) </p>

так что вы можете использовать этот алгоритм, который имеет сложность O (n / p), когда p <= n / log n и O (log n) в противном случае. </p>

1 голос
/ 25 июля 2012
1 голос
/ 23 декабря 2011

Я подозреваю, что это O (N / P) + O (P)

  • Разделение работы между процессорами P обойдется в O (P)
  • объединение работы, выполняемой процессорами P, также стоит O (P)
  • Идеальный параллельный поиск N элементов процессорами P требует затрат времени O (N / P)

Мой наивный алгоритм был бы

  • записать элемент 0 в ячейку CREW с пометкой «результат»
  • начать P полностью независимых поисков, каждый через 1 / P-й из N элементов
  • после завершения каждого поиска используйте CAS spinloop, чтобы заменить «результат» результатом частичного поиска, если он больше. (В зависимости от вашего определения CREW вам может не понадобиться спин-петля)
...