Параллельные вычисления в R: в чем разница между «разветвлением» с многоядерным процессором и «разветвлением» со снегом? - PullRequest
0 голосов
/ 07 июля 2019

Я экспериментировал с параллельными вычислениями в 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 - что почти решает мою проблему, но не совсем.)

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

...