Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Torque/MOAB调度器设置doSNOW和SOCK群集?_R_Foreach_Parallel Processing_Cluster Computing_Torque - Fatal编程技术网

如何使用Torque/MOAB调度器设置doSNOW和SOCK群集?

如何使用Torque/MOAB调度器设置doSNOW和SOCK群集?,r,foreach,parallel-processing,cluster-computing,torque,R,Foreach,Parallel Processing,Cluster Computing,Torque,继续,将doSNOW和SOCK cluster连接到Torque/MOAB调度器的最佳实践是什么,以避免处理外部并行循环的部分代码的内部并行循环中的处理器相关性 从中,不与调度程序交互的基线代码可以是: library(doSNOW) hosts <- c('host-1', 'host-2') cl <- makeSOCKcluster(hosts) registerDoSNOW(cl) r <- foreach(i=1:4, .packages='doMC') %dopar

继续,将doSNOW和SOCK cluster连接到Torque/MOAB调度器的最佳实践是什么,以避免处理外部并行循环的部分代码的内部并行循环中的处理器相关性

从中,不与调度程序交互的基线代码可以是:

library(doSNOW)
hosts <- c('host-1', 'host-2')
cl <- makeSOCKcluster(hosts)
registerDoSNOW(cl)
r <- foreach(i=1:4, .packages='doMC') %dopar% {
  registerDoMC(2)
  foreach(j=1:8, .combine='c') %dopar% {
    i * j
  }
}
stopCluster(cl)  
库(doSNOW)

hostsTorque始终创建一个包含Moab分配给作业的节点名称的文件,并通过
PBS\u NODEFILE
环境变量将该文件的路径传递给作业。节点名称可能会多次列出,以表明它为该节点上的作业分配了多个核心。在这种情况下,我们希望为
PBS\u NODEFILE
中的每个唯一节点名启动一个群集工作程序,但要跟踪每个节点上分配的核心数,以便在注册
doMC
时指定正确的核心数

下面是一个函数,它读取
PBS\u NODEFILE
,并返回包含分配的节点信息的数据帧:

getnodes <- function() {
  f <- Sys.getenv('PBS_NODEFILE')
  x <- if (nzchar(f)) readLines(f) else rep('localhost', 3)
  as.data.frame(table(x), stringsAsFactors=FALSE)
}
这保证了每个辅助进程上的“allocated.cores”变量的值等于该节点出现在
PBS\u NODEFILE
中的次数

现在,我们可以在注册
doMC
时使用该全局变量:

r <- foreach(i=seq_along(nodes$x), .packages='doMC') %dopar% {
  registerDoMC(allocated.cores)
  foreach(j=1:allocated.cores, .combine='c') %dopar% {
    i * j
  }
}

当通过
qsub
命令提交时,R脚本将创建一个包含四个工作进程的SOCK集群,每个工作进程将使用8个内核执行内部
foreach
循环。但是,由于R代码是通用的,因此无论通过
qsub

请求多少资源,它都应该做正确的事情。这是否发生了变化?我的系统没有registerDoMC()或registerDoSNOW(),只有registerDoParallel()。@Dominik没有,它没有改变。registerDoMC函数是在doMC包中定义的,它依赖于并行包。对不起,我现在看到了。在
setcores
函数中,您在哪里设置
cores
?或者我应该将其更改为一个数字?@Dominik setcores函数使用clusterApply,使用
节点$Freq
中的计数,在每个worker上设置“allocated.cores”变量。我在回答中添加了更多的解释,以使这一点更加清楚(我希望)。@Dominik当您使用
qsub
交互登录并使用
-l nodes=1:ppn=4
等选项在一个节点上请求4个内核时,您应该会在
$PBS_NODEFILE
中看到本地主机四次。如果没有,则应与系统管理员联系。
setcores <- function(cl, nodes) {
  f <- function(cores) assign('allocated.cores', cores, pos=.GlobalEnv)
  clusterApply(cl, nodes$Freq, f)
}
setcores(cl, nodes)
r <- foreach(i=seq_along(nodes$x), .packages='doMC') %dopar% {
  registerDoMC(allocated.cores)
  foreach(j=1:allocated.cores, .combine='c') %dopar% {
    i * j
  }
}
#!/bin/sh
#PBS -l nodes=4:ppn=8
cd "$PBS_O_WORKDIR"
R --slave -f hybridSOCK.R