У меня есть 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 массивов, но мне интересно, если каждый массив вычисляет одинвычисление.Другими словами, если один массив = один узел = одно сравнение между двумя подматрицами?
Bests
Редактировать:
Так выглядит 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