Я экспериментировал с параллельными вычислениями в R с использованием пакета doParallel
. Насколько я понимаю, в зависимости от того, как вы называете registerDoParallel
, вы можете использовать multicore
API или snow
API.
Например, чтобы использовать разветвление с multicore
, вы должны сделать что-то вроде этого:
registerDoParallel(4)
И чтобы использовать разветвление с snow
, вы должны сделать что-то вроде этого:
cl <- makeCluster(4, type="FORK")
registerDoParallel(cl)
У меня довольно простая работа * - вычисление сводной статистики по матричному объекту. Однако, несмотря на то, что оба эти подхода якобы используют разветвление (и, следовательно, все дочерние задания должны иметь доступ к одному и тому же адресному пространству для работы с этой матрицей), я получаю дико различную производительность / использование памяти. (В частности, multicore
работает существенно лучше.)
Прежде чем пытаться диагностировать это дальше, я подумал, что должен спросить: есть ли у кого-нибудь интуитивное объяснение, почему это происходит, и если это нормально? Я всюду искал ресурс, который разбил бы различия между ними, но я не смог найти ничего, что бы разбило его подробно. Существуют ли случаи, когда, скажем, будет запущена версия multicore
, а версия snow
(из-за проблем с памятью)?
(Примечание. Это все на Mac с 16 ГБ ОЗУ. Я читал эти темы - Использует ли многоядерные вычисления с использованием пакета doParallel от R больше памяти? и для чтения глобальных переменных с использованием foreach в R - что почти решает мою проблему, но не совсем.)
* Я рад предоставить свой код, но он не выглядит актуальным для этого примера. Я надеюсь на более общий анализ различий между этими двумя подходами.