我尝试在一台Linux机器上运行一个R脚本,其中两个CPU每个包含8个物理内核。
R代码通过detectCores()
自动识别核心数,将此数量减少一个,并将其实现到makePSOCKcluster
命令中。根据性能参数,R仅使用其中一个CPU并对所包含的内核进行超线程化。没有工作负载分配给第二个CPU。
如果我指定detectCores(logical = FALSE)
,第一个CPU上观察到的负担会变小,但第二个CPU仍处于非活动状态。
我该如何解决这个问题?由于整个基础架构位于一台机器中,因此在这种情况下不需要Rmpi
。
仅供参考:R脚本包含依赖于foreach
包的doSNOW
个循环。
答案 0 :(得分:1)
在我的案例中,解决方案不是依赖snow
。相反,我使用mpirun
启动R脚本,并让此命令管理来自R外部的并行环境。doSNOW
需要相应地替换为doMPI
。
通过此设置,两个CPU都得到了充分利用。
答案 1 :(得分:0)
尝试使用并使用task \ worker列表定义集群类型和长度 它适用于我,并在不同的核心\过程上运行每个任务 考虑(如果可能的话)单独重新定义每个任务而不仅仅是使用 foreach 。
这是我使用的一个例子,
out 的结果将是列表中每个核心的所有结果列表。
tasks = list(task1,taks2, ...)
cl = makeCluster(length(Tasks), type = "PSOCK")
clusterEvalQ(cl,c(library(dplyr),library(httr)))
clusterExport(cl, list("varname1", "varname2"),envir=environment())
out <- clusterApply(
cl,
Tasks,
function(f) f()
)