Этот график в разделе "Параллельное и параллельное программирование": http://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity, по-видимому, указывает на то, что серьезных накладных расходов слишком много. Но если вы внимательно посмотрите на ось y, вы заметите, что она была увеличена до интересного раздела. Фактически, соотношение между показателями наилучшего и наихудшего случая составляет около 80%, что не так уж плохо.
В целом, выяснение того, как и сколько для куска сложно, подвержено ошибкам, чрезвычайно специфично для приложений и, вероятно, изменится в следующем году, когда вы купите новый компьютер с большей вычислительной мощностью. Я бы предпочел всегда использовать rpar с наиболее мелкозернистыми предметами и жить с 25% накладными расходами.
Может ли накладные расходы на искрение, как правило, хуже, чем показано на этом графике? (особенно если я всегда сбрасываю бинарные деревья, а не списки, поэтому вторая маркерная точка "объем последовательной работы" не применяется)
Обновленный вопрос в ответ на ответ Дона Стюарта:
Имеется ли в искровом пуле только одна очередь, к которой все процессоры стремятся получить доступ? или их много?
Например, если у меня есть компьютер с бесконечными процессорами и двоичное дерево, и я хочу взять сумму по всем листам, как в:
data Node = Leaf Int | Branch Node Node
sumL (Leaf x) = x
sumL (Branch n1 n2) = let (x,y) = (sumL n1, sumL n2) in (x `par` y) `seq` (x + y)
Будет ли эта программа работать в O (#leaves) времени? или O (глубина)? Есть ли лучший способ написать это?
Пожалуйста, дайте мне знать, если я слишком много абстрагирую, чтобы получить удовлетворительный ответ. Моя ментальная модель работы haskell parallelism по-прежнему очень нечеткая.