在群集上运行openmp

Atu*_*pta 2 c parallel-processing cluster-computing openmp

我必须在具有不同配置的集群上运行openmp程序(例如不同数量的节点).但我遇到的问题是,每当我尝试用2个节点运行程序时,那么同一块程序运行2次而不是并行运行.

我的节目 -

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));
Run Code Online (Sandbox Code Playgroud)

这是一个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!"
Run Code Online (Sandbox Code Playgroud)

Ale*_*ogt 7

小心,你在这里混淆MPIOpenMP.

OpenMP与Threads一起工作,即在不通过分布式存储器系统的几个节点进行通信的共享存储器上(存在一些技术可以这样做,但它们的性能不够好).

你正在做的是在每个节点上启动相同的程序.如果你在哪里使用MPI,这没关系.但在您的情况下,您启动两个具有默认线程数的进程.这两个过程是相互独立的.

我建议进一步研究共享内存并行化编程(如OpenMP)和分布式内存并行化(如MPI)的主题.有大量的教程,我会推荐Hager和Wellein撰写的"科学家和工程师高性能计算简介 "一书.

要尝试您的程序,请从一个节点开始,并指定OMP_NUM_THREADS如下:

OMP_NUM_THREADS=1 ./openmpNew "$i"
OMP_NUM_THREADS=2 ./openmpNew "$i"
...
Run Code Online (Sandbox Code Playgroud)

以下是SLURM的示例脚本:link.