[HPC] mpich2 기반 HPC 시스템 환경 구축하기

####   New Version MPI 환경 구성

작성일 : 2008년 2월 21일
작성자 : 서진우



1. intel v10 compiler + mkl v10 환경 구축 하기

– Intel CC, FC는 기존 설치 방법과 동일 함.

– Intel MKL 설치 하기.
설치 방법은 동일. 추가 환경 설정 방법은 다음과 같다.

# cd /engrid/enhpc/intel/mkl/tools/environment/
# cp mklvarsem64t.* /etc/profile.d/

/engrid/enhpc/intel/mkl/benchmarks 에 Intel에 최적화된 HPL 등이 존재 한다.
이걸 이용하면 쉽게 HPL 테스트를 할 수 있다.


2. mpich2 + intel 환경 구축 하기

# export FC=ifort
# export F77=ifort
# export F90=ifort
# export CC=icc
# export CXX=icpc
# export RSHCOMMAND=/usr/bin/rsh

# ./configure –prefix=/engrid/enhpc/mpich2/intel –enable-timing=runtime –enable-f77 –enable-f90 –enable-cxx –enable-romio –enable-threads=multiple –enable-mpe –with-thread-package=pthreads

# make && make install
# cd ~
# vi .mpd.conf
———————————————————————–
MPD_SECRETWORD=password
———————————————————————–

# chmod 600 .mpd.conf
# ensync .mpd.conf
# vi /etc/mpd.hosts
———————————————————————–
node00:8
node01:4
node02:4
node03:4
node04:4
———————————————————————–

# mpdboot -r /usr/bin/rsh -n 5 –ncpus=8 -f /etc/mpd.hosts
  -r : 통신프로토콜명령
  -n : 노드수
  –ncpus : Master 서버  Core 수
  -f : 노드와 core 리스트 파일
  ;; –ncpus 와 -f 사용 시 -f 로 불려오는 노드와 core 리스트 파일에 등록된 정보를 기본으로 클러스터 작업 노드 구성을
     하게 되는데 mpdboot를 실행하는 노드의 코어 수가 다를 경우 –ncpus를 이용하여 별도로 코어수를 다르게 지정할 수 있다.
         즉 node00의 core수가 8이고 나머지는 4개일 경우 ..
     node00에서 “mpdboot -r rsh -n 5 -f /etc/mpd.hosts” 라고 실행한 후 “mpiexec -n 20″을 실행하면 코어 배열이 모든 서버
     가 동일하게 4개씩 활당이 된다. 하지만 “mpdboot -r rsh -n 5 -f /etc/mpd.hosts –ncpus=8” 이라고 실행한 후…
     “mpiexec -n 20” 을 실행하면 node00 에서 core 8개가 활당되고, 나머지 노드에서는 core 3개씩 활당이 되어진다.

# mpdtrace : mpdboot 로 구성된 클러스터 작업 구성을 보여 준다.

# mpdrun -l -n 8 hostname : mpdboot 로 구성된 서버 프로세서에게 hostname 명령을 배열대로 실행 시킨다.

# mpdallexit : mpdboot 로 구성된 클러스터 구성을 해제한다.


3. mpich2 and mkl 제공 기본 BMT 사용하기

– MKL 제공 HPL 사용하기

mkl v10 에서 제공하는 benchmark를 이용하여 쉽게 HPL을 실행할 수 있다.

# cd /engrid/enhpc/intel/mkl/benchmarks/mp_linpack
# vi Make.em64t
————————————————————————–

.
.
  CC      = mpicc  # 해당 mpicc 경로를 적어 주면 된다.
————————————————————————–

# make arch=em64t install
# cd bin/em64t
# vi HPL.dat -> 환경에 맞게 수정
# mpiexec -n 10 ./xhpl


이 밖에 MKL에 기본적으로 컴파일이 되어 있는 xhpl 이 있다.

/engrid/enhpc/intel/mkl/benchmarks/mp_linpack/bin_intel 밑에 서버 아키텍처별로 디렉토리가 생성되어 있다.
이것을 이용해서 테스트 해도 된다. 성능은 직접 컴파일한 거 보다 좋게 나온다. ^^;;



– MPICH2 제공 BMT 프로그램 사용하기

# cd /engrid/enhpc/mpich2/intel/share/
밑에 다양한 BMT 툴이 있다 .해당 디렉토리에 가서 make 하고 mpiexec를 실행하면 된다.


4. Netpipe 테스트 하기

# tar xzvf NetPIPE.x.x.x.tar.gz
# cd NetPIPE-x.x.x
# vi makefile
————————————————————————–
CC         = cc
CFLAGS     = -O
SRC        = ./src

# 해당 MPICC 의 PATH 를 적어 넣는다
MPICC       = /engrid/enhpc/mpich2/intel/bin/mpicc
.
.
MPI2CC   = /engrid/enhpc/mpich2/intel/bin/mpicc
MPI2_LIB = /engrid/enhpc/mpich2/intel/lib
MPI2_INC = /engrid/enhpc/mpich2/intel/include
.
————————————————————————-

# make tcp
# make mpi


– tcp 테스트
tcp bendwitch 테스트는 두대 서버간의 네트워크 패킷 크기별 전송 대역폭과 응답속도를 측정해 준다.
먼저 source 서버에서 NPtcp 데몬을 실행하고, 원격 서버에서 NPtcp -h hostname 으로 실행하면 된다.

local > ./NPtcp
remote > ./NPtcp -h local
——————————————————————————————

Now starting the main loop
  0:       1 bytes   1602 times –>      0.12 Mbps in      62.45 usec
  1:       2 bytes   1601 times –>      0.24 Mbps in      62.45 usec
  2:       3 bytes   1601 times –>      0.37 Mbps in      62.45 usec
  3:       4 bytes   1067 times –>      0.28 Mbps in     110.50 usec

.
.
120: 6291459 bytes      3 times –>    895.89 Mbps in   53577.82 usec
121: 8388605 bytes      3 times –>    896.60 Mbps in   71380.81 usec
122: 8388608 bytes      3 times –>    896.65 Mbps in   71377.16 usec
123: 8388611 bytes      3 times –>    896.60 Mbps in   71380.85 usec
——————————————————————————————

– mpi 테스트

mpi 테스트는 mpi를 실행할 두대 서버간의 mpi 통신 시 네트워크 대역폭을 측정하는 것이다.

# vi mpdhosts
——————————————————————————————
node00
node01
——————————————————————————————

# mpdboot -n 2 -r rsh -f mpdhosts
# mpiexec -n 2 ./NPmpi
——————————————————————————————-
0: node00
1: node01
Now starting the main loop
  0:       1 bytes   1602 times –>      0.12 Mbps in      62.46 usec
  1:       2 bytes   1600 times –>      0.24 Mbps in      62.46 usec
  2:       3 bytes   1600 times –>      0.24 Mbps in      94.28 usec
  3:       4 bytes    707 times –>      0.49 Mbps in      62.46 usec

.
.
118: 6291453 bytes      3 times –>    894.53 Mbps in   53659.32 usec
119: 6291456 bytes      3 times –>    891.74 Mbps in   53827.64 usec
120: 6291459 bytes      3 times –>    894.61 Mbps in   53654.99 usec
121: 8388605 bytes      3 times –>    894.83 Mbps in   71521.80 usec
122: 8388608 bytes      3 times –>    894.85 Mbps in   71520.01 usec
123: 8388611 bytes      3 times –>    894.82 Mbps in   71522.51 usec
——————————————————————————————

5. HPL 테스트 하기

v10대 Mkl 이용시 HPL makefile 정의 내용 중 변경 사항이 있다.
기존의 Make.MPI-INTEL 파일 내용을 아래와 같이 변경한다.
——————————————————————————————-
LAdir        = /engrid/enhpc/intel/mkl/lib/em64t
LAinc        =
LAlib        = $(LAdir)/libmkl_intel_lp64.a $(LAdir)/libmkl_intel_thread.a \\
$(LAdir)/libmkl_core.a $(LAdir)/libguide.a -lpthread

.
CC           = $(MPP_HOME)/bin/mpicc
CCNOOPT      = $(HPL_DEFS) -O0 -w
CCFLAGS      = $(HPL_DEFS) -O3 -axP -w

.
LINKER       = $(MPP_HOME)/bin/mpicc
LINKFLAGS    = $(CCFLAGS) -static_mpi
——————————————————————————————

# make arch=MPI-INTEL install

mkl 에서 제공하는 HPL 과 비슷한 성능을 나타낸다.


6. IMB 테스트 하기

IMB 는 Intel MPI Benchmark 툴로서 MPI 실행 시 프로세서의 네트워크 간의 통신 성능을 측정하는
BMT 툴이다.

# cd IBM_3.1/src
# vi make_mpich
——————————————————————————————
MPI_HOME= /engrid/enhpc/mpich2/intel  <- MPI 환경에 맞게 수정
.
.
——————————————————————————————

# make -f make_mpich

그럼 IBM_MPI1 실행파일이 생성된다.

# mpdboot -n 5 -r rsh -f ~mpd.hosts
# mpiexec -n 10 ./IMB-MPI1 > ~/IMB_test_result.txt
# cat ~/IMB_test_result.txt
—————————————————————————————–
#—————————————————
#    Intel (R) MPI Benchmark Suite V3.1, MPI-1 part    
#—————————————————
# Date                  : Fri Feb 22 02:18:29 2008
# Machine               : x86_64
# System                : Linux
# Release               : 2.6.9-55.ELsmp
# Version               : #1 SMP Fri Apr 20 16:36:54 EDT 2007
# MPI Version           : 2.0
# MPI Thread Environment: MPI_THREAD_MULTIPLE



# Calling sequence was:

# ./IMB-MPI1

# Minimum message length in bytes:   0
# Maximum message length in bytes:   4194304
#
# MPI_Datatype                   :   MPI_BYTE
# MPI_Datatype for reductions    :   MPI_FLOAT
# MPI_Op                         :   MPI_SUM  
#
#

# List of Benchmarks to run:

# PingPong
# PingPing
# Sendrecv
# Exchange
# Allreduce
# Reduce
# Reduce_scatter
# Allgather
# Allgatherv
# Gather
# Gatherv
# Scatter
# Scatterv
# Alltoall
# Alltoallv
# Bcast
# Barrier

#—————————————————
# Benchmarking PingPong
# #processes = 2
# ( 8 additional processes waiting in MPI_Barrier)
#—————————————————
       #bytes #repetitions      t[usec]   Mbytes/sec
.
      4194304           10     35973.11       111.19
#—————————————————
# Benchmarking PingPing
# #processes = 2
# ( 8 additional processes waiting in MPI_Barrier)
#—————————————————
       #bytes #repetitions      t[usec]   Mbytes/sec
.
      4194304           10     42797.59        93.46
#—————————————————————————–
# Benchmarking Sendrecv
# #processes = 2
# ( 8 additional processes waiting in MPI_Barrier)
#—————————————————————————–
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]   Mbytes/sec
.
      4194304           10     41784.69     41796.92     41790.81       191.40
#—————————————————————————–
# Benchmarking Sendrecv
# #processes = 4
# ( 6 additional processes waiting in MPI_Barrier)
#—————————————————————————–
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]   Mbytes/sec
.
      4194304           10     37605.91     37795.21     37721.81       211.67
#—————————————————————————–
# Benchmarking Sendrecv
# #processes = 8
# ( 2 additional processes waiting in MPI_Barrier)
#—————————————————————————–
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]   Mbytes/sec
.
      4194304           10     37590.60     37884.59     37688.60       211.17
#—————————————————————————–
# Benchmarking Sendrecv
# #processes = 10
#—————————————————————————–
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]   Mbytes/sec
.
      4194304           10     37523.60     37732.20     37627.89       212.02
#—————————————————————————–
# Benchmarking Exchange
# #processes = 2
# ( 8 additional processes waiting in MPI_Barrier)
#—————————————————————————–
       #bytes #repetitions  t_min[usec]  t_max[usec]  t_avg[usec]   Mbytes/sec
.
      4194304           10     86003.80     86012.60     86008.20       186.02

.
.
#—————————————————
# Benchmarking Barrier
# #processes = 2
# ( 8 additional processes waiting in MPI_Barrier)
#—————————————————
#repetitions  t_min[usec]  t_max[usec]  t_avg[usec]
         1000        62.45        62.45        62.45

#—————————————————
# Benchmarking Barrier
# #processes = 4
# ( 6 additional processes waiting in MPI_Barrier)
#—————————————————
#repetitions  t_min[usec]  t_max[usec]  t_avg[usec]
         1000       166.50       166.62       166.57

#—————————————————
# Benchmarking Barrier
# #processes = 8
# ( 2 additional processes waiting in MPI_Barrier)
#—————————————————
#repetitions  t_min[usec]  t_max[usec]  t_avg[usec]
         1000       285.03       285.04       285.04

#—————————————————
# Benchmarking Barrier
# #processes = 10
#—————————————————
#repetitions  t_min[usec]  t_max[usec]  t_avg[usec]
         1000       436.79       437.18       437.00

—————————————————————————————–

7. Stream 메모리 테스트

# tar xzvf stream_memory.tgz
# cd StreamMemory/Code/
# gcc -O stream.c -o stream
# ./stream
————————————————————-
This system uses 8 bytes per DOUBLE PRECISION word.
————————————————————-
Array size = 2000000, Offset = 0
Total memory required = 45.8 MB.
Each test is run 10 times, but only
the *best* time for each is used.
————————————————————-
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 7914 microseconds.
   (= 7914 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
————————————————————-
WARNING — The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
————————————————————-
Function      Rate (MB/s)   Avg time     Min time     Max time
Copy:        2837.6441       0.0102       0.0113       0.0113
Scale:       2802.5668       0.0103       0.0114       0.0114
Add:         3150.0100       0.0137       0.0152       0.0153
Triad:       3127.2576       0.0138       0.0153       0.0154
————————————————————-
Solution Validates
————————————————————-

– Intel 컴파일러로 최적화 컴파일 시 ..

# icc -O3 stream.c -o stream
# ./stream
————————————————————-
This system uses 8 bytes per DOUBLE PRECISION word.
————————————————————-
Array size = 2000000, Offset = 0
Total memory required = 45.8 MB.
Each test is run 10 times, but only
the *best* time for each is used.
————————————————————-
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 6740 microseconds.
   (= 6740 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
————————————————————-
WARNING — The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
————————————————————-
Function      Rate (MB/s)   Avg time     Min time     Max time
Copy:        3935.5421       0.0073       0.0081       0.0082
Scale:       3874.9813       0.0074       0.0083       0.0083
Add:         4087.8496       0.0106       0.0117       0.0118
Triad:       4088.9289       0.0106       0.0117       0.0118
————————————————————-
Solution Validates
————————————————————-

최적화 환경에서 메모리 전송률의 차이가 1GB/s 정도 향상이 된다.

– gcc 을 이용한 표준 방식

gcc -O stream.c -o stream

– g77 을 이용한 표준 방식

gcc -c mysecond.c
g77 -O stream.f mysecond.o -o stream

or sometimes

gcc -c -DUNDERSCORE mysecond.c
g77 -O stream.f mysecond.o -o stream

– mpi 를 이용한 표준 방식

gcc -c -DUNDERSCORE mysecond.c
mpif77 -O stream_mpi.f mysecond.o -o stream_mpi


– 메모리 이론치 산정
memory clock * 8 (DDR의 경우 여기서 2를 더 곱한다.)
메인보드 FSB 지원 부분 : 1333 = 1333 * 8 (32bit), 1333 = 1333 * 16 (64bit)
CPU FSB 파악




7. NPB 테스트 하기

# tar xzvf NPB3.2.tar.gz
# cd NPB3.2/NPB3.2-MPI/
# cd config/
# cp make.def.template make.def
# vi make.def
———————————————————————————-
아래 항목을 환경에 맞게 수정함
.
MPIF77 = /engrid/enhpc/mpich2/intel/bin/mpif77
.
FMPI_LIB  = -L/engrid/enhpc/mpich2/intel/lib -lmpi
.
FMPI_INC = -I/engrid/enhpc/mpich2/intel/include
.
MPICC = /engrid/enhpc/mpich2/intel/bin/mpicc
.
CMPI_LIB  = -L/engrid/enhpc/mpich2/intel/lib -lmpi
.
———————————————————————————

이제 간단한 모델 하나를 컴파일 해 보자
# cd ..
# make LU NPROCS=2 CLASS=S
# cd bin
# ls
lu.S.4

정상적으로 컴파일을 했으면 위와 같이 lu.S.4 란 실행파일이 생성 되어 있을 것이다.
이제 필요한 실행 파일을 일괄적으로 컴파일 해 보자

NPB 의 주요 벤치마크 모델에 대한 설명이나 suite.def에 대한 설명은 이전에 배포한 이전 문서를
살펴 보면 된다.

# vi config/make.suite
——————————————————————————–
ft      S       8
mg      S       8
sp      S       4
lu      S       8
bt      S       4
is      S       8
ep      S       8
cg      S       8
dt      S       8
——————————————————————————-

# make suite
# bin
# ls
bt.S.4  cg.S.8  dt.S  ep.S.8  is.S.8  lu.S.4  lu.S.8  mg.S.8  sp.S.4

# mpiexec -n 8 ./cg.S.8
——————————————————————————
NAS Parallel Benchmarks 3.2 — CG Benchmark

Size:       1400
Iterations:    15
Number of active processes:     8
Number of nonzeroes per row:        7
Eigenvalue shift: .100E+02

   iteration           ||r||                 zeta
        1       0.14007433599912E-12     9.9986441579140
        2       0.22832842650801E-14     8.5733279203222
        3       0.20667072504918E-14     8.5954510374058
        4       0.20147744607421E-14     8.5969972340737
        5       0.20860579382960E-14     8.5971549151767
        6       0.19920782216430E-14     8.5971744311608
        7       0.19617605550665E-14     8.5971770704913
        8       0.20837892722887E-14     8.5971774440630
        9       0.19379127563197E-14     8.5971774983942
       10       0.19401001173125E-14     8.5971775064409
       11       0.18760873052386E-14     8.5971775076486
       12       0.18533243795008E-14     8.5971775078318
       13       0.19294692914155E-14     8.5971775078598
       14       0.18723926834078E-14     8.5971775078641
       15       0.18265867152505E-14     8.5971775078648
Benchmark completed
VERIFICATION SUCCESSFUL
Zeta is      0.859717750786E+01
Error is     0.123972559909E-14


CG Benchmark Completed.
Class           =                        S
Size            =                     1400
Iterations      =                       15
Time in seconds =                     0.35
Total processes =                        8
Compiled procs  =                        8
Mop/s total     =                   192.35
Mop/s/process   =                    24.04
Operation type  =           floating point
Verification    =               SUCCESSFUL
Version         =                      3.2
Compile date    =              22 Feb 2008

Compile options:
    MPIF77       = /engrid/enhpc/mpich2/intel/bin/mpif77
    FLINK        = $(MPIF77)
    FMPI_LIB     = -L/engrid/enhpc/mpich2/intel/lib -lmpi
    FMPI_INC     = -I/engrid/enhpc/mpich2/intel/include
    FFLAGS       = -O3
    FLINKFLAGS   = -O3
    RAND         = randi8


Please send the results of this run to:

NPB Development Team
Internet: npb@nas.nasa.gov

If email is not available, send this to:

MS T27A-1
NASA Ames Research Center
Moffett Field, CA  94035-1000

Fax: 650-604-3957

———————————————————————————

NPB 에 대한 부가 설명

NPB 는 모델 유형과 계산 크기, 사용되는 프로세스 수에 따라 실행 파일이 정해 짐. 아래는 모델에 대한 설명임

* NPB 모델에 대한 설명

BT : Navier-Stokes 라는 물리학 방정식을 푸는 문제. 큰메세지를 조금씩 주고 받으므로 CPU 성능과 큰 크기에 대한
통신 성능을 알수 있음.

CG : 행렬 방정식의 고유해를 구하는 계산. 불규칙적인 큰 크기의 메세지를 조금씩 주고 받음. 큰 크기의 통신 성능을
측정할때 사용함.

EP : 노드마다 서로 상관없는 계산을 함. 서로 통신 하지 않으므로 CPU 성능을 측정할때만 사용함.

FT : FFT라는 방법으로 미분 방정식을 계산함. 계산량이 많기 때문에 큰 크기에서의 통신 성능과 CPU 성능 측정시 사용.

IS : 임의의 정수 수열을 크기대로 정렬하는 계산. 다른 계산은 주로 수소점 계산이지만 이것은 정수 계산만 함.

LU : BT 와 NS 방정식을 다른 방법을 푼다. 작은 크기의 메세지를 많이 주고 받아서 작은 크기의 문제를 테스트할때 사용.

MG : Poisson 방정식이라는 전자기학 방정식 해를 구함. 노드 사이에 배열을 수시로 주고 받음으로 작은 크기의 통신 성능
시험.

SP : BT 와 성격 비슷함.

* 계산 크기 ..

위의 8가지 유형에 따라 계산 크기는 S, W, A, B, C, D 종류로 나누어짐. 크기는 순서대로 큰 Size의 문제라고 보면됨.

* 프로세스의 수는 2의 승수로 정해짐 ( 1.2.4.8.16..)

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.