2013-10-13 123 views
1

我必須在具有不同配置(例如不同數量的節點)的羣集上運行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!" 
+0

您是否嘗試在不同節點或多線程上運行OpenMP工具?你是怎麼稱呼該計劃的?您使用了哪些選項? –

+0

Hi @AlexanderVogt - 首先,我使用-fopenmp選項編譯了使用gcc編譯器的程序。然後我使用上面的腳本將它放入集羣。 –

回答

5

要小心,你是在混淆MPI的OpenMP這裏。

OpenMP的工作與上線程,即共享存儲器不溝通過分佈式存儲器系統的若干節點(存在一些技術來這樣做,但它們不是高性能的足夠)。

你在做什麼是在兩個節點上啓動相同的程序。如果你在哪裏使用MPI,這會很好。但在你的情況下,你開始兩個進程與默認數線程。這兩個過程是相互獨立的。

我將在共享內存並行編程(像OpenMP的)和分佈式內存並行(如MPI)的主題提出了一些進一步的研究。這裏有大量的教程,我會推薦本書「科學家和工程師的高性能計算簡介」,由Hager和Wellein編寫的

來試試你的計劃,開始在一個節點上,並指定OMP_NUM_THREADS,如:

OMP_NUM_THREADS=1 ./openmpNew "$i" 
OMP_NUM_THREADS=2 ./openmpNew "$i" 
... 

下面是SLURM一個示例腳本:link