Clojure: количество блоков для pmap по сравнению с ядрами процессора
Мне предстоит выполнить большую вычислительную работу, которая в основном заключается в применении логистической регрессии на 500 000 серий. Поскольку работа тяжелая, я разделил ее на 4 части серии 125000.
У меня есть 2-ядерный процессор с гиперпоточностью, и результат действительно намного быстрее.
Но у меня есть вопрос по этому поводу. Должно ли количество чанков совпадать с количеством ядер (или потоков в случае гиперпоточности)? Я не уверен в том, как работает pmap, я прочитал conf incanter и все еще не уверен, потому что у парня есть 2 ядра и я делю работу на 4 потока.
В любом случае, это довольно тяжелая работа (более 5 часов с pmap, намного больше без нее), поэтому любая существенная оптимизация приветствуется.
Спасибо
2 ответа
Проверять, выписываться clojure.core.reducers
прежде чем строить свой собственный.
Думать об этом для личного развития - важный проект, потому что он строит понимание и понимание того, насколько серьезна эта проблема. Хорошие решения включают такие понятия, как "кража работы", например, когда незанятые процессоры могут брать работу у занятых.
В реальной жизни лучше всего перейти прямо к встроенным редукторам Clojure. Они делают это обманчиво простым, если вы работаете с неизменяемыми векторами в качестве входных данных, и он автоматически будет управлять инфраструктурой форка / соединения Java для обработки размеров пакетов и рабочих назначений. Также этот пост в блоге дает много общего.
Затем вы можете захотеть использовать преобразователи, чтобы уменьшить количество создаваемых промежуточных структур данных.
Намек на то, чтобы посмотреть c.c.reducers
хороший. Если все в порядке, если результаты вашей работы возвращаются не по порядку, вы также можете проверить Tesser, который предоставит вам аккуратный API с большой гибкостью и мощью, и успешно выполнять вашу работу в нескольких потоках или в Hadoop. кластер в зависимости от ваших потребностей.