繁体   English   中英

在R parallel :: mcparallel中,是否有可能限制一次使用的内核数?

[英]Is it possible, in R parallel::mcparallel, to limit the number of cores used at any one time?

在R中, parallel包中的mcparallel()函数每次都会将新任务派生给工作程序。 例如,如果我的计算机具有N个(物理)核心,而我分叉了2N个任务,则每个核心都会开始运行两个任务,这是不希望的。 我希望能够在N个工作线程上开始运行N个任务,然后在完成每个任务后,将下一个任务提交到现在可用的核心中。 是否有捷径可寻?

我的任务花费的时间不同,因此不能选择分批分发N个任务。可能有一些解决方法,例如检查活动核心的数量,然后在空闲时提交新任务,但是有谁知道一个简单的解决方案?

我试过设置cl <- makeForkCluster(nnodes=N) ,的确设置了N个内核,但是mcparallel()并没有使用mcparallel() 确实,似乎没有办法将cl送入mcparallel() 后者有一个选项mc.affinity ,但目前尚不清楚如何使用它,而且它似乎也无法满足我的要求(根据文档,其功能取决于机器)。

您至少有两种可能性:

  1. 如上所述,您可以使用mcparallel的参数“ mc.cores”或“ mc.affinity”。 在AMD平台上,首选“ mc.affinity”,因为两个内核共享同一时钟。 例如,FX-8350具有8个核心,但是核心0与核心1具有相同的时钟。如果仅针对2个核心启动任务,则最好将其分配给核心0和1,而不是0和2。 ”。 价格正在失去负载平衡。

    软件包的最新版本中包含“ mc.affinity”。 请参阅changelog以查找引入的内容。

  2. 您也可以使用OS的工具来设置相似性,例如“任务集”:

    / usr / bin / taskset -c 0-1 / usr / bin / R ...

    在这里,您可以使脚本仅在核心0和1上运行。

请记住,Linux将其内核从“ 0”开始编号。 程序包并行符合R的索引,并且第一个核心是核心编号1。

我建议并行利用包含此功能的更高级别的功能,而不要尝试强迫低级功能执行您想要的操作。

在这种情况下,请尝试将您的任务编写为单个函数的不同参数。 然后,可以将mc.preschedule参数设置为TRUE并将mc.cores参数设置为一次要使用的线程数来使用mclapply()。 每次任务完成并关闭线程时,都会创建一个新线程,对下一个可用任务进行操作。

即使每个任务使用完全不同的代码位,您也可以创建函数列表并将其传递给包装函数。 例如,以下代码一次执行两个功能。

f1 <- function(x) {x^2}
f2 <- function(x) {2*x}
f3 <- function(x) {3*x}
f4 <- function(x) {x*3}
params <- list(f1,f2,f3,f4)
wrapper <- function(f,inx){f(inx)}
output <- mclapply(params,FUN=calling,mc.preschedule=TRUE,mc.cores=2,inx=5)

如果需要,可以使params为列表列表,其中包括要传递给每个函数的各种参数以及函数定义。 我经常将此方法用于不同长度的各种任务,并且效果很好。

当然,您的各种任务可能只是对同一函数的不同调用,在这种情况下,您可以直接使用mclapply,而无需编写包装函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM