Однопроцессную версию вашего кода следует заменить на lists:max/1
. Полезная функция для распараллеливания кода выглядит следующим образом:
pmap(Fun, List) ->
Parent = self(),
P = fun(Elem) ->
Ref = make_ref(),
spawn_link(fun() -> Parent ! {Ref, Fun(Elem)} end),
Ref
end,
Refs = [P(Elem) || Elem <- List],
lists:map(fun(Ref) -> receive {Ref, Elem} -> Elem end end, Refs).
pmap/2
применяется Fun
к каждому элементу List
параллельно и собирает результаты в порядке ввода. Чтобы использовать pmap с этой проблемой, вам нужно будет сегментировать исходный список в список списков и передать его в pmap. например lists:max(pmap(fun lists:max/1, ListOfLists))
. Конечно, процесс сегментирования списков был бы более дорогостоящим, чем простой вызов lists:max/1
, поэтому это решение потребовало бы предварительной сегментации списка. Даже тогда, вероятно, что издержки копирования списков перевешивают любые преимущества распараллеливания - особенно на одном узле.
Внутренняя проблема вашей ситуации заключается в том, что вычисление каждой подзадачи является крошечным по сравнению с накладными расходами на управление данными. Задачи, требующие больших вычислительных ресурсов (например, составление списка больших чисел), легче распараллелить.
Это не означает, что нахождение максимального значения нельзя распараллелить, но я считаю, что это потребует предварительной сегментации или сегментирования ваших данных таким образом, чтобы не требовалось повторение каждого значения.