IPM 으로 MPI 프로파일링 분석 하기
목차
1. IPM Download
2. IPM 설치
3. IPM 사용
1. IPM Download
IPM은 MPI프로그램을 실행했을 때, MPI함수별 호출 카운트나 사용된 시간등을 프로파일링 해주는 툴이다.
http://ipm-hpc.sourceforge.net/installation.html # IPM 다운로드
위의 링크에서 소스파일을 다운받고,
http://ploticus.sourceforge.net/doc/download.html # Ploticus 다운로드
관련 패키지인 Ploticus를 다운 받도록 한다.
또한, 컴파일을 위해서는 openmpi 기준으로 1.4.5 이하(그 상위 버전중 1.6대는 컴파일 안됨)버전이 설치되어 있어야 한다.
2. IPM 설치
소스파일 형태로 제공하고 있는 IPM은 소스 자체적으로 GNU컴파일러나 INTEL컴파일러를 이용해서 컴파일 할 경우, 뭔가 문제가 있는 듯 하다.
configure 스크립트 자체에 문제가 있음..
일단 configure 과정이 정상적으로 마무리 될 수 있도록 configure를 수정하도록 한다.
라인 500번부터 519번 라인까지는 컴파일러 $TRY_CXX $CXX cxx xlC sxCC pgCC g++ 컴파일러중 유효한
컴파일러를 체크하기 위해 사용되는 간단한 샘플 코드 부분이다. 소스 내용을 보면 printf 구문을 사용하고 있으나, 헤더파일 그 어디에도 stdio관련 내용이 없다. #include <stdio> 내용을 추가하거나 printf 구문을 cout으로 변경해서 configure과정이 정상적으로 진행 될 수 있도록 수정한다.
500 #include <iostream>
501 #include <iostream>
502 #include <iomanip>
503 #include <string>
// #include <stdio> 추가 혹은,
504
505 using namespace std;
506
507 inline int sub1(int a);
508
509 int main() {
510 cout << ” Hello world. I am a C++ program.” << endl;
511 // sub1(1);
512 return 0;
513 }
514
515 int sub1(int a) {
516 // printf(“%d\n”, a);
517 cout << a << endl; // 이 구문을 추가
518 return 1;
519 }
수정이 끝났다면, ./configure 실행 # 어차피 정상적으로 컴파일하긴 어렵기 때문에, default값으로 설정 후 실행한다은.
이 후 make하면 libipm.a가 lib밑에 생성되는데 이 라이브러리를 mpi소스 컴파일 할 때 추가하여 컴파일 한 후 사용하면 프로파일링이 된다고 하지만, 안된다.
다른 소개 하고 있는 방법이 shared 라이브러리를 가지고, preload해서 사용하는 방법인데, 컴파일 하는 방법은 make shared 이다. 그런데 컴파일하려고 하면 역시나 컴파일이 안된다.
configure 파일처럼 makefile에도 문제가 있는 듯 한데, 고치려 하지말고 아래의 명령어를 가지고 컴파일 하도록 한다.
cd src
mpicc -DIPM_DISABLE_EXECINFO -I/mnt/ipm/include -DWRAP_FORTRAN -fPIC -c -I../include libipm.c
mpicc -shared -o libipm.so libipm.o
실행을 하고 나면, libipm.so라는 라이브러리가 src디렉토리에 생성한다. 잘 보관하도록 한다.
추가로
/etc/profile.d/ipm.sh 를 생성하여,
#!/bin/bash
export PATH=/ipm설치디렉토리/bin:$PATH
내용을 추가하도록 한다.
다음은 ploticus라는 소프트웨어 설치이다. ploticus라는 소프트웨어는 ipm의 결과 파일(xml포맷)을 웹페이지를 통해 GUI로 확인할 수 있도록 변환시켜주는 프로그램이다. xml->html 변환기라고 보면된다.
소스 파일을 다운 받은 후에 압축 풀고, make하도록 한다.
방법은 그냥 make 이다.
make 이후 pl이라는 바이너리 파일이 생성된다.
/etc/profile.d/ploticus.sh에
#!/bin/bash
export PATH=/pl바이너리파일이있는경로:$PATH
내용을 추가하도록 한다.
3. IPM 사용
사용 방법은 pre 과정과 post과정으로 나눌 수 있다.
pre 과정은 mpi 작업에 libipm.so를 추가하여 프로파일링 정보를 추출하는 과정이다.
post 과정은 프로파일링 된 정보를 ploticus를 이용하여 변환 및 확인하는 과정이다.
1. pre과정
LD_PRELOAD=/libimp.so라이브러리가있는경로/libipm.so mpirun -np 4 lmp_linux < in.melt.5.0
으로 실행하면 된다. 노드간 병렬 계산일 경우 libipm.so파일은 노드쪽에도 공유하고 있어야 한다.
2. post과정
계산이 끝나고 나면 일단 기본적으로 lammps의 경우, 실행이 끝나고 나면
##IPMv0.983####################################################################
#
# command : unknown (completed)
# host : rnt000/x86_64_Linux mpi_tasks : 4 on 1 nodes
# start : 05/09/13/16:50:14 wallclock : 0.375420 sec
# stop : 05/09/13/16:50:15 %comm : 14.61
# gbytes : 0.00000e+00 total gflop/sec : 0.00000e+00 total
#
##############################################################################
# region : * [ntasks] = 4
#
# [total] <avg> min max
# entries 4 1 1 1
# wallclock 1.50079 0.375199 0.375024 0.37542
# user 1.64575 0.411437 0.408937 0.414936
# system 0.31895 0.0797375 0.076988 0.082987
# mpi 0.219334 0.0548336 0.0363278 0.0687285
# %comm 14.6059 9.67658 18.3197
# gflop/sec 0 0 0 0
# gbytes 0 0 0 0
#
#
# [time] [calls] <%mpi> <%wall>
# MPI_Send 0.110074 8154 50.19 7.33
# MPI_Allreduce 0.0509405 304 23.23 3.39
# MPI_Recv 0.0495727 18 22.60 3.30
# MPI_Wait 0.00345445 8154 1.57 0.23
# MPI_Irecv 0.00235604 8154 1.07 0.16
# MPI_Sendrecv 0.00142744 312 0.65 0.10
# MPI_Bcast 0.00107314 208 0.49 0.07
# MPI_Rsend 0.000300311 18 0.14 0.02
# MPI_Scan 6.89399e-05 4 0.03 0.00
# MPI_Barrier 6.17739e-05 8 0.03 0.00
# MPI_Comm_size 2.91997e-06 20 0.00 0.00
# MPI_Comm_rank 2.512e-06 40 0.00 0.00
###############################################################################
IPM: 0 log IPMLOG_DIR not available using $CWD
의 내용을 standard out으로 출력하며, 계정명.숫자.숫자.0 형식의 xml 파일을 결과물로 제공한다.
이 파일을 html로 변환하도록 한다.
ipm_parse -html 계정명.숫자.숫자.0
변환하게 되면 unkown_x_계정.숫자.숫자.숫자_ipm_unkown 형식의 폴더가 생셩되며 하위 내용을 확인해보면 index.html 포함한 데이타 파일이 생성된 것을 확인할 수 있다.
index.html을 웹브라우저로 열면 이글 최초에 첨부한 이미지 결과를 GUI 형태로 확인할 수 있다.
#!/bin/bash
export PATH=/ipm설치디렉토리/bin:$PATHz