Для параллельного алгоритма с N потоками может ли прирост производительности быть больше, чем N?

Теоретический вопрос, может быть, он очевиден:

Возможно ли, что алгоритм, реализованный параллельно с N потоками, будет выполняться более чем в N раз быстрее, чем исходный однопоточный алгоритм? Другими словами, может ли прирост быть лучше линейного с количеством потоков?


person Jakub M.    schedule 25.10.2011    source источник


Ответы (3)


Это не распространено, но, скорее всего, возможна.

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

В таком случае последовательные вычисления на одном процессоре обычно ограничиваются пропускной способностью основной памяти. Предполагая, что у вас есть (как минимум) столько же процессоров/ядер (каждое с собственным кэшем данных), сколько шагов конвейера, вы можете загрузить каждый кэш данных один раз и обрабатывать один пакет данных за другим, сохраняя одинаковые статические данные для всех из них. Теперь ваши вычисления могут выполняться со скоростью процессора, а не ограничиваться пропускной способностью основной памяти, поэтому увеличение скорости легко может быть в 10 раз больше, чем количество потоков.

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

person Jerry Coffin    schedule 25.10.2011
comment
Вы также иногда видите это, когда переходите к нескольким узлам, и теперь у вас есть несколько пропускных способностей памяти / сетевых каналов / каналов ввода-вывода для доступа - если конкуренция за них была первоначальным узким местом, вы можете кратко увидеть сверхлинейное ускорение именно по той причине, которую описал Джерри. над. - person Jonathan Dursi; 25.10.2011

Да.

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

person David Thornley    schedule 25.10.2011
comment
Интересный момент! Современные решатели SAT часто используют агрессивные стратегии перезапуска именно по этой причине. - person hugomg; 25.10.2011
comment
@missingno: звучит интересно, можешь дать ссылки? - person Jakub M.; 25.10.2011
comment
Основная идея состоит в том, что для NP полных задач распределение длины до решения сильно смещено в сторону экспоненциального наихудшего случая (в отличие от очень простого сценария наилучшего случая). Тем не менее, я не могу придумать никаких хороших ссылок, кроме полного излишества sat manual (см. врезку). SAT - глубокий человек... Во всяком случае, не помешает упомянуть Minisat. - person hugomg; 25.10.2011
comment
Однако для этого не требуется несколько потоков. Вы можете реализовать это, используя один поток и что-то похожее на переключение контекста. То есть вычислить часть одного вычисления, затем часть второго и т. д. - person svick; 25.10.2011
comment
@svick: поздравляю, вы только что заново изобрели потоки пользовательского режима. - person Jerry Coffin; 25.10.2011
comment
@JerryCoffin, дело в том, что эти «потоки» будут работать в одном фактическом потоке и поэтому будут использовать только одно ядро ​​ЦП. Это означает, что ускорение происходит из-за использования другого алгоритма, а не из-за наличия большего количества доступных ядер. (На самом деле я бы не реализовал это таким образом, если бы не было веской причины для этого.) - person svick; 25.10.2011
comment
@svick: Нет; исходный алгоритм выполнял полуслучайное блуждание по фазовому пространству. Выполнение нескольких сразу изменило бы алгоритм. Более того, при выполнении потоков на уровне пользователя происходит переключение контекста, что может замедлять работу, делая многопоточную реализацию сверхлинейной. - person David Thornley; 29.10.2011

закон Амдала (распараллеливание) говорит нам, что в общем случае это невозможно. В лучшем случае мы можем точно разделить работу на N. Причина этого в том, что без последовательной части формула Амдала для ускорения принимает вид:

Ускорение = 1/(1/N)

где N — количество процессоров. Это, конечно, сводится к N.

person Michael Goldshteyn    schedule 25.10.2011
comment
Хотя закон Амдала не учитывает некоторые практические детали, например цену переключения контекста. - person ruslik; 25.10.2011
comment
@dacc: да, если вы распараллеливаете последовательный алгоритм, нет, если вы сериализуете параллельный. - person ruslik; 25.10.2011
comment
Закон Амдала — очень полезное эмпирическое правило, но оно далеко не исчерпывающая теория параллельных вычислений. Как и в ответе @Jerry Coffin, эффекты кеша (или, аналогично, эффекты пропускной способности памяти, используемые при использовании нескольких узлов) иногда могут давать сверхлинейное ускорение на небольшом количестве процессоров. - person Jonathan Dursi; 25.10.2011