我尝试运行一些“非常平行”的代码,所以我开始研究并行处理。我试图在Linux机器上使用parLapply
(因为它在我的Windows机器下工作得很好,而mclapply
会将代码限制在Linux)但我遇到了一些问题。
这就是我的代码的样子:
cl <- makeCluster(detectCores(), type="FORK") # fork -> psock when I use Win
clusterExport(cl, some.list.of.things)
out <- parLapply(cl, some.fun)
stopCluster(cl)
首先,我注意到并行实现实际上比顺序实现要慢得多,原因是在我的Linux机器上,每个子进程都继承了父进程的CPU。至少我认为我可以通过观察在系统监视器中,我所有的r-session进程只有大约8%左右的CPU时间,并且只使用了一个核心来得出这个结论。请参阅this really helpful thread here。
我最终使用了最后一个帖子的代码,即:
system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
我需要在这里提一下,我对任何Linux基础知识都不熟悉。这是我的大学服务器由其他人运行,我不知道上面的代码实际意味着什么,除了将“1”更改为“ff”(无论“ff”代表什么)。无论如何,在执行上面的代码之后,我可以看到8个子进程中有3个接收到几乎完整的CPU时间,这是一个很大的改进。
话虽如此,有8个核心(由detectCores()
确定)和8个子进程(如系统监视器中所示),但“仅”3个子进程正在工作。
鉴于我对并行处理完全不熟悉,我想知道您是否可以就如何使用所有8个内核给我一些指导。我觉得自己像一个盲人,不知道他应该寻找什么来解决这个问题。任何指向我应该改变或可能是什么问题的指针都将受到高度赞赏!