R:makePSOCKcluster超线程占50%的CPU核心

时间:2017-12-29 10:31:32

标签: r parallel-processing hyperthreading

我尝试在一台Linux机器上运行一个R脚本,其中两个CPU每个包含8个物理内核。 R代码通过detectCores()自动识别核心数,将此数量减少一个,并将其实现到makePSOCKcluster命令中。根据性能参数,R仅使用其中一个CPU并对所包含的内核进行超线程化。没有工作负载分配给第二个CPU。

如果我指定detectCores(logical = FALSE),第一个CPU上观察到的负担会变小,但第二个CPU仍处于非活动状态。

我该如何解决这个问题?由于整个基础架构位于一台机器中,因此在这种情况下不需要Rmpi

仅供参考:R脚本包含依赖于foreach包的doSNOW个循环。

2 个答案:

答案 0 :(得分:1)

在我的案例中,解决方案不是依赖snow。相反,我使用mpirun启动R脚本,并让此命令管理来自R外部的并行环境。doSNOW需要相应地替换为doMPI

通过此设置,两个CPU都得到了充分利用。

答案 1 :(得分:0)

尝试使用enter image description here并使用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()
    )