R中的并行处理:并非所有核心都使用

时间:2014-04-10 13:54:36

标签: linux r multithreading parallel-processing

我尝试运行一些“非常平行”的代码,所以我开始研究并行处理。我试图在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个内核给我一些指导。我觉得自己像一个盲人,不知道他应该寻找什么来解决这个问题。任何指向我应该改变或可能是什么问题的指针都将受到高度赞赏!

0 个答案:

没有答案