[HPC] New Version MPI 환경 구성 – 테라곤(teragon) new install

####   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...

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