Как я могу пометить свои подпроцессы для регистрации при использовании многоядерных и doMC в R - PullRequest
3 голосов
/ 29 марта 2011

Я начал использовать пакет doMC для R в качестве параллельного бэкенда для распараллеленных подпрограмм plyr.

Кажется, что само распараллеливание работает нормально (хотя мне еще предстоит правильно измерить ускорение), моя проблема в том, что ведение журнала теперь асинхронно и сообщения из разных ядер смешиваются друг с другом. Я мог бы создать разные лог-файлы для каждого ядра, но мне кажется, что более подходящее решение - просто добавить разные метки для каждого ядра. В настоящее время я использую пакет log4r для своих нужд.

Я помню, что при использовании MPI каждый процессор получал звание, что было способом отличить каждый процесс друг от друга, так есть ли способ сделать это с doMC? У меня была идея извлечь PID, но это кажется грязным и будет меняться для каждой итерации.

Я открыт для идей, поэтому любые предложения приветствуются.

РЕДАКТИРОВАТЬ (2011-04-08): Исходя из предложения одного ответа, у меня все еще остается проблема правильного определения того, в каком подпроцессе я сейчас нахожусь, так как мне бы потребовались отдельные замыкания для каждого log() вызовите, чтобы он записал в правильный файл, иначе у меня будет одна log() функция, но внутри есть некоторая логика, определяющая, к какому файлу журнала добавляться. В любом случае, мне все еще нужен какой-нибудь способ маркировки текущего подпроцесса, но я не уверен, как это сделать.

Есть ли эквивалент функции mpi_rank() в библиотеке MPI?

1 Ответ

4 голосов
/ 29 марта 2011

Я думаю, что запись нескольких процессов в один и тот же файл - это рецепт катастрофы (хотя это всего лишь журнал, поэтому, возможно, "катастрофа" немного сильна).

Часто я распараллеливаю работу над хромосомами. Вот пример того, что я бы сделал (я в основном использовал foreach / doMC):

foreach(chr=chromosomes, ...) %dopar% {
  cat("+++", chr, "+++\n")
  ## ... some undoubtedly amazing code would then follow ...
}

И было бы весьма необычно получить выходные данные, которые попирают друг друга ... что-то как (не совсем) это:

+++chr1+++
+++chr2+++
++++chr3++chr4+++

... вы поняли ...

Если бы я был на вашем месте, думаю, я бы разделил журналы для каждого процесса и установил их соответствующие имена файлов как уникальные в отношении того, что происходит в цикле этого процесса (как chr в моем случае выше). Разобрать их позже, если нужно ... т.е. отобразить / уменьшить файлы журнала: -)

...