我已经开始使用 R 的 doMC
包作为并行化 plyr
例程的并行后端。
并行化本身似乎工作正常(尽管我还没有正确地对加速进行基准测试),我的问题是日志记录现在是异步的,来自不同内核的消息混合在一起。我可以为每个核心创建不同的日志文件,但我认为我更简洁的解决方案是为每个核心添加一个不同的标签。我目前正在使用 log4r
包来满足我的日志记录需求。
我记得在使用 MPI 时每个处理器都有一个等级,这是一种区分每个进程的方式,那么有没有办法用 doMC
做到这一点?我确实有提取 PID 的想法,但这看起来确实很困惑,并且每次迭代都会改变。
虽然我对想法持开放态度,因此欢迎提出任何建议。
编辑(2011-04-08):按照一个答案的建议,我仍然有正确识别我当前所在的子进程的问题,因为我要么需要单独的闭包每个 log()
调用,以便它写入正确的文件,或者我会有一个 log()
函数,但其中有一些逻辑决定要追加哪个日志文件至。在任何一种情况下,我仍然需要某种方式来标记当前的子流程,但我不确定该怎么做。
MPI 库中是否有与 mpi_rank()
函数等效的函数?
最佳答案
我认为让多个进程写入同一个文件会导致灾难(虽然它只是一个日志,所以也许“灾难”有点强)。
我经常对染色体进行并行处理。这是我将要执行的操作的示例(我主要使用 foreach/doMC):
foreach(chr=chromosomes, ...) %dopar% {
cat("+++", chr, "+++\n")
## ... some undoubtedly amazing code would then follow ...
}
并且得到相互践踏的输出并不罕见......像(不完全是)这样的东西:
+++chr1+++
+++chr2+++
++++chr3++chr4+++
...你明白了...
如果我处在你的位置,我想我会为每个进程拆分日志,并将它们各自的文件名设置为与该进程循环中发生的事情相关的唯一文件名(比如我的 chr
以上案例)。如果必须,请稍后整理它们……即。映射/减少你的日志文件:-)
关于r - 在 R 中使用多核和 doMC 时如何标记我的子进程以进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472599/