我必须在具有不同配置(例如不同数量的节点)的群集上运行openmp程序。 但是我面临的问题是,无论何时我试图用2个节点运行程序,那么同一段程序运行2次而不是并行运行。在群集上运行openmp
我的程序 -
gettimeofday(&t0, NULL);
for (k=0; k<size; k++) {
#pragma omp parallel for shared(A)
for (i=k+1; i<size; i++) {
//parallel code
}
#pragma omp barrier
for (i=k+1; i<size; i++) {
#pragma omp parallel for
//parallel code
}
}
gettimeofday(&t1, NULL);
printf("Did %u calls in %.2g seconds\n", i, t1.tv_sec - t0.tv_sec + 1E-6 * (t1.tv_usec - t0.tv_usec));
这是一个LU分解程序。 当我运行它2节点上,然后我得到的输出是这样的 -
难道5.2秒
1000个电话的确在5.3秒
1000个电话的确在41秒
2000调用41秒难道2000个电话
正如你所看到的每个程序运行两次,每个值(1000,2000,3000 ...),而不是并行运行。 这是我的家庭作业计划,但我坚持在这一点上。
我正在使用SLURM脚本在我的大学计算群集上运行此程序。这是教授提供的标准脚本。
#!/bin/sh
##SBATCH --partition=general-compute
#SBATCH --time=60:00:00
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
##SBATCH --mem=24000
# Memory per node specification is in MB. It is optional.
# The default limit is 3GB per core.
#SBATCH --job-name="lu_openmpnew2nodes"
#SBATCH --output=luopenmpnew1node2task.out
#SBATCH --mail-user=***@***.edu
#SBATCH --mail-type=ALL
##SBATCH --requeue
#Specifies that the job will be requeued after a node failure.
#The default is that the job will not be requeued.
echo "SLURM_JOBID="$SLURM_JOBID
echo "SLURM_JOB_NODELIST"=$SLURM_JOB_NODELIST
echo "SLURM_NNODES"=$SLURM_NNODES
echo "SLURMTMPDIR="$SLURMTMPDIR
cd $SLURM_SUBMIT_DIR
echo "working directory = "$SLURM_SUBMIT_DIR
module list
ulimit -s unlimited
#
echo "Launch luopenmp with srun"
export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
for i in {1000..20000..1000}
do
srun ./openmpNew "$i"
done
#
echo "All Done!"
您是否尝试在不同节点或多线程上运行OpenMP工具?你是怎么称呼该计划的?您使用了哪些选项? –
Hi @AlexanderVogt - 首先,我使用-fopenmp选项编译了使用gcc编译器的程序。然后我使用上面的脚本将它放入集群。 –