Как быстро можно "найти макс в массиве", возможно, получить?

107
13

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


Вам предоставляется массив из числа N и машина с процессорами P и общая память CREW (память Concurrent Read, Exclusive Write).


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


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

спросил(а) 2020-03-25T20:32:19+03:00 2 месяца назад
1
Решение
115

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

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

ответил(а) 2020-03-25T20:50:54.003689+03:00 2 месяца назад
91

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

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

ответил(а) 2020-03-25T20:32:19+03:00 2 месяца назад
83

Ниже приведена оптимальная оценка:


Если 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 процессоров и log n время; но на самом деле, в этом алгоритме большинство процессоров в большинстве случаев неактивны; (см., например, книгу сложности Papadimitriou) их число можно опустить до n/log n.


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


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


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


n/p + log p <= n/p + log (n/log n) <= n/p + log n <= n/p + n/p <= 2n/p = O (п/р)


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

ответил(а) 2020-03-25T20:32:19+03:00 2 месяца назад
54

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


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

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


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

ответил(а) 2020-03-25T20:32:19+03:00 2 месяца назад
53

При P = N ^ 2 это O (1).


Все инициализировать булевой массив CannotBeMax [i] = FALSE


Proc (i, j) устанавливает CannotBeMax [i] = A [i] А [J]


Макс - это A [CannotBeMax [i] == FALSE]


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

ответил(а) 2020-03-25T20:32:19+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема