Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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群集设置为在单个环路中每个节点使用多个内核_R_Foreach_Parallel Processing_Pbs_Torque - Fatal编程技术网

将torque/moab群集设置为在单个环路中每个节点使用多个内核

将torque/moab群集设置为在单个环路中每个节点使用多个内核,r,foreach,parallel-processing,pbs,torque,R,Foreach,Parallel Processing,Pbs,Torque,这是一个后续行动[ 我有一个内存有限的脚本,它只使用1foreach循环,但我希望在node1上运行2次迭代,在node2上运行2次迭代。上面的链接问题允许您启动一个SOCK集群到外部循环的每个节点,然后启动MC集群到内部循环,我认为没有利用e上的多核每个节点。 我收到了警告信息 警告消息: 关闭未使用的连接3(为了使用foreach/doParallel的多个节点,在调用makePSOCKcluster时指定主机名向量。如果要在这些主机上使用多个内核,只需多次指定主机名,以便makePSOCK

这是一个后续行动[

我有一个内存有限的脚本,它只使用1
foreach
循环,但我希望在node1上运行2次迭代,在node2上运行2次迭代。上面的链接问题允许您启动一个SOCK集群到外部循环的每个节点,然后启动MC集群到内部循环,我认为没有利用e上的多核每个节点。 我收到了警告信息
警告消息:

关闭未使用的连接3(为了使用foreach/doParallel的多个节点,在调用
makePSOCKcluster
时指定主机名向量。如果要在这些主机上使用多个内核,只需多次指定主机名,以便
makePSOCKcluster
将在每个主机上启动多个工作进程

由于您使用的是Torque资源管理器,因此可以使用以下函数生成节点列表,该列表可以限制在任何节点上启动的最大工作人员数:

getnodelist <- function(maxpernode=100) {
  f <- Sys.getenv('PBS_NODEFILE')
  x <- if (nzchar(f)) readLines(f) else rep('localhost', 3)
  d <- as.data.frame(table(x), stringsAsFactors=FALSE)
  rep(d$x, pmin(d$Freq, maxpernode))
}

getnodelist请求一个作业在每个节点上使用的核心数超过核心数,这只是在修改qsub,使其具有-l nodes=1:ppn=X,其中X是您希望使用的核心数。我不知道作业提交在堆栈中的什么位置,但如果您能将其放置在堆栈的适当部分,则会解决您的问题。我认为这行不通它。我请求-l nodes=4:ppn=8,但当你为每个节点设置一个SOCK集群时,我的理解是有4个R实例,每个实例位于每个节点的1个核心上。我希望使用8个核心,每个节点上2个,但是注册MC似乎会关闭SOCK集群,如果它是同一个循环(与内部循环相反)。您需要确保您的MPI脚本(或启动每个进程的任何脚本)理解ppn部分。此外,对于记录,如果您希望每个节点有两个核心,ppn应等于2,而不是8。ppn=8表示您希望每个节点有8个核心。不幸的是,如果您请求整个节点(8个核心),则im使用的系统仅允许单作业节点使用因此,ppn=8。所以我的问题是,如何告诉r在单个foreach实例中的4个节点上分别使用2个内核(链接的问题显示了嵌套的并行循环)?非常感谢!这就是我想要的。在我的系统上,PBS_节点文件已经为每个核心列出了每个节点,所以只需
f@Dominik最大的区别是,在执行foreach循环时,doMC工作线程是分叉的,而makePSOCKcluster工作线程可以通过ssh启动,并且可以跨多个循环持久化N序列,但foreach试图使它们尽可能一致地工作。
library(doParallel)
f <- Sys.getenv('PBS_NODEFILE')
nodes <- unique(if (nzchar(f)) readLines(f) else 'localhost')
print(nodes)
[1] "compute-3-15" "compute-1-32"
cl <- makePSOCKcluster(nodes, outfile='')
starting worker pid=25473 on compute-3-15.local:11708 at 16:54:17.048
starting worker pid=14746 on compute-3-15.local:11708 at 16:54:17.523
registerDoParallel(cl)
r=foreach(i=seq(1,6),.combine='c') %dopar% { Sys.info()[['nodename']]}
print(r)
 [1] "compute-3-15.local" "compute-1-32.local" "compute-3-15.local"
 [4] "compute-1-32.local" "compute-3-15.local" "compute-3-15.local"
library(doMC)
registerDoMC(4)
r=foreach(i=seq(1,6),.combine='c') %dopar% { Sys.info()[['nodename']]}
print(r)
[1] "compute-3-15.local" "compute-3-15.local" "compute-3-15.local"
[4] "compute-3-15.local" "compute-3-15.local" "compute-3-15.local"
getnodelist <- function(maxpernode=100) {
  f <- Sys.getenv('PBS_NODEFILE')
  x <- if (nzchar(f)) readLines(f) else rep('localhost', 3)
  d <- as.data.frame(table(x), stringsAsFactors=FALSE)
  rep(d$x, pmin(d$Freq, maxpernode))
}
library(doParallel)
nodelist <- getnodelist(2)
print(nodelist)
cl <- makePSOCKcluster(nodelist, outfile='')
registerDoParallel(cl)
r <- foreach(i=seq_along(nodelist), .combine='c') %dopar% {
  Sys.info()[['nodename']]
}
cat('results:\n')
print(r)