我有一个R脚本,我想分成几个作业,每个作业在集群的一个节点上。
res<-foreach(i = seq_len(nrow(combs))) %dopar% {
G1 <- split[[combs[i,1]]]
G2 <- split[[combs[i,2]]]
bind <- cbind(data[,G1], data[,G2])
rho.i <- cor_rho(bind) #the function cor_rho I created
}
这是我要并行化的代码。我将一个大矩阵划分为多个子矩阵,然后计算这些子矩阵的每种组合之间的相关性:
子矩阵1与子矩阵2:节点1 子矩阵1与子矩阵3:节点2 等等
我尝试过类似的操作(例如,如果我有10种组合要计算),我不会向您展示完整的SLURM代码:
#SBATCH --array=1-10
Rscript my_R_script > my_output
它创建了10个数组,但我想知道每个数组是否计算一个计算。换句话说,如果一个数组=一个节点=两个子矩阵之间的一个比较?
最佳
编辑:
combs
的外观如下:
> combs
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 1 4
[4,] 1 5
[5,] 2 3
[6,] 2 4
[7,] 2 5
[8,] 3 4
[9,] 3 5
[10,] 4 5
combs <- combs[opt$subset,] #SLURM_ARRAY_TASK_ID
#The loop which computes each combination
res <- foreach(i = seq_len(nrow(combs))) %dopar% {
G1 <- split[[combs[i,1]]]
G2 <- split[[combs[i,2]]]
dat.i <- cbind(data[,G1], data[,G2])
rho <- cor_rho(dat.i)
}
#I fill my final matrix
resMAT <- matrix(0, ncol(data), ncol(data))
for(i in 1:nrow(combs)){
batch1 <- split[[combs[i,1]]]
batch2 <- split[[combs[i,2]]]
patch.i <- c(batch1, batch2)
resMAT[patch.i, patch.i] <- res[[i]]
}
然后,我的SLURM代码:
#!/bin/bash
#SBATCH -o slurmjob-%A-%a.out
#SBATCH --job-name=parallel_nodes
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --array=1-10
#Set up whatever package we need to run with
module load gcc/8.1.0 openblas/0.3.3 R
# SET UP DIRECTORIES
OUTPUT="$HOME"/PROJET_M2/data/$(date +"%Y%m%d")_parallel_nodes
mkdir -p "$OUTPUT"
echo $SLURM_ARRAY_TASK_ID
subset=$((SLURM_ARRAY_TASK_ID))
Rscript my_R_code > "$OUTPUT"/"$SLURM_ARRAY_TASK_ID"
我使用:
执行此脚本sbatch --partition normal --array 1-10 RHO_COR.sh
我收到一条消息错误:
Error in combs[i, 1] : index out of bounds
答案 0 :(得分:0)
我想知道每个数组是否计算一个计算。
阵列的每次运行都可以运行一个(或可能多个脚本)。
换句话说,如果一个数组=一个节点=两个子矩阵之间的一个比较?
是的,您可以这样做。虽然您可能想指定比较之一。
我真的不知道如何指定需要在哪个数组上进行计算的比较。
有很多方法可以指定需要在哪个数组上进行计算的比较。例如,您可以将数组编号用作选择的参数/条件。例如。您将有一个 n 个比较列表和一个 n 个数组编号列表,并根据数组编号选择一个在列表中具有相同索引/位置的对应比较。注意:您可能还想适当地命名输出-否则,您将尝试创建具有相同名称的 n 不同的输出文件,如果它们位于相同的位置,则可能会造成麻烦。
我收到一条消息错误:Error in combs[i, 1] : index out of bounds
这是由于combs
之后的subset
的尺寸与索引之间的不匹配引起的。例如。您正在尝试访问不存在的梳子的位置。