2009-11-09 5 views
12

Я ищу карту скромно дорогостоящей функции на большой ленивый seq параллельно. pmap отлично, но я теряю много переключение контекста. Я думаю, мне нужно увеличить размер куска работы, который передается каждому потоку.Как эффективно использовать среднюю функцию в параллельном режиме

Я написал о функции, чтобы сломать seq на куски и pmap функцию на каждый кусок и перекомпилировать их. это «работает», но результаты не были впечатляющими. Исходный код по существу выглядит следующим образом:

(pmap eval-polynomial (range x) coificients) 

Как я могу сжать это, сохраняя его ленивым?

ответ

0

Я бы посмотрел библиотеку Fork/Join, интегрированную в JDK 7. Это легкая модель потоковой передачи, оптимизированная для неблокирующих, делящихся и захваченных вычислений над набором данных, с использованием пула потоков, планировщика работы и зеленые нити.

Some work был завершен, чтобы обернуть API Fork/Join в ветке par, но он не был объединен с основной (yet).

+1

Да, если вы можете ждать номинальной отрасли я бы, на маленькие кусочки, которые я видел в нем сногсшибательное. – Runevault

+1

@ Рюнево, как он дует. Кажется, что обертка на вилке соединяется – Surya

1

Если вы не против чего-то слегка экзотического (в обмен на какое-то действительно заметное ускорение), вы также можете заглянуть в работу, проделанную автором Penumbra-библиотеки, которая предоставляет easy access to the GPU.

3

Я бы посмотрел функцию ppmap с: http://www.braveclojure.com/zombie-metaphysics/. Он позволяет вам pmap при определении размера куска.

Решение этой проблемы заключается в увеличении размера зерна или в размере работы, выполняемой каждой параллелизированной задачей. В этом случае задача - применить функцию сопоставления к одному элементу коллекции. Размер зерна не измеряется ни в одном стандартном блоке, но вы можете сказать, что размер зерен размером до по умолчанию составляет по умолчанию. Увеличение размера зерна до двух означает, что вы применяете функцию сопоставления к двум элементам вместо одного, поэтому поток, на который выполняется задача, больше работает. [...] Просто для удовольствия мы можем обобщить эту технику на функцию , называемую ppmap, для секционированного pmap. Он может получить более одной коллекции, так же, как карта:

(defn ppmap 
    "Partitioned pmap, for grouping map ops together to make parallel 
    overhead worthwhile" 
    [grain-size f & colls] 
    (apply concat 
    (apply pmap 
      (fn [& pgroups] (doall (apply map f pgroups))) 
      (map (partial partition-all grain-size) colls)))) 
(time (dorun (ppmap 1000 clojure.string/lower-case orc-name-abbrevs))) 
; => "Elapsed time: 44.902 msecs" 
+1

Ссылки приходят и уходят, stackoverflow навсегда ... Не могли бы вы включить соответствующую цитату из braveclojure, чтобы убедиться, что этот ответ остается в контексте в долгосрочной перспективе. (также этот вопрос почти 7 лет) –

Смежные вопросы