2010-09-17 1 views
6

Похож на clojure will have a fork-join implementation, который выглядит как функциональная оболочка над каркасом вилок java.clojure pmap/preduce vs fork-join

Мне интересно, какая разница между ними и pmap/preduce?

+0

Это собирается быть темой разговора на Clojure-CONJ конференции: http://clojure-conj.org/speakers#liebke David liebke теперь активно работает над этим для следующей версии clojure –

+0

@Alex, этот абстрактный вопрос подсказывает этот вопрос :). – Surya

+0

Рассматривается ли какая-либо мысль стратегии реализации fork-join на ClojureCLR или, как правило, для поддержки API fork-join дружественна альтернативным реализациям? –

ответ

3

Вилка-соединение является более общей, чем последовательность /preduce и должна обеспечивать более мелкозернистый контроль над параллелизмом. Точные API для этого все еще находятся в воздухе.

2

От взгляда на этот код их функциональность будет в основном одинаковой - единственная разница в том, что pmap использует фьючерсы, запущенные в Agent threadpool, в качестве базового примитива, в то время как pvmap использует fork-join.

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

Он также выглядит (на данный момент, по крайней мере) каркас fork-join поддерживает только векторы, поэтому он не является полу-ленивым, как pmap.

1

Одно из отличий, насколько я понимаю, заключается в том, что pmap будет работать только в той степени, в какой он «подавленности». Функция отображается над каждым членом последовательности, указанной в pmap. Если зернистость слишком мала, потенциальные преимущества параллелизма проглатываются из-за создания и управления слишком большим количеством Future.

Вилка-соединение позволяет краже работы, так что количество запусков на каждой нити может быть адаптивным.

1

Ни PMAP, ни pvmap не избавит нас от необходимости использовать правильный размер блока. Для моих проектов, которые обычно означают разбиение данных на куски и использование карты на каждом фрагменте, затем используйте pmap для сопоставления кусков параллельно. затем уменьшить и сгладить.