MPI를 이용한 병렬처리 프로그램

ZDNet Korea에서 제작한 동영상입니다. 한번쯤 봐두면 좋을 듯 하네요 ^^;;






Posted by hongiiv

2007/12/27 10:18 2007/12/27 10:18
,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/296

기계학습에 빠져 버리다.

Map-Reduce for Machine Learning on Multicore
Map-Reduce를 이용한 Machine Learning(locally weighted liner regression, k-means, logistic regression, naive Bayes, SVM, ICA, Principal Component Analysis, gaussian discriminant analysis, EM, backpropagation)의 속도 향상

IBM Parallel Machine Learning Toolbox
classification: Support-vetcor machine(SVM) and liner least squars
clustering: k-means, fuzzy k-means, kernel k-means, and Iclust
Feature reduction: Principal Component Analysis(PCA) and kernel PCA
에 대해서 MPICH2를 이용한 속도 향상

Parallelization of multicategory support vector machines(PMC-SVM) for classifying microarray data
multi-category 문제를 해결하기 위한 sequential minimum optimization(SMO) 알고리즘인 LibSVM을 C++과 MPI를 사용해서 속도 향상

각각 특색이 있단 말이지, 세번째꺼는 일반적인 내용으로 기존의 라이브러리에 MPI를 적용시켜서 병렬화한 것으로 매우 일반적인 모습의 속도 향상이 되겠고, 두번째는 IBM의 alphaWorks에서 수행한 프로젝트라는점이 매우 특색있고, 마지막으로 첫번째는 map-reduce를 이용했다는 점에서 MPI를 사용한 두개와 차별성이 있다.


Posted by hongiiv

2007/12/26 22:44 2007/12/26 22:44
, , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/295

Sun Developer Network Korea병렬 컴퓨팅 환경에서의 어플리케이션 개발에 대한 내용의 글이 올라왔습니다. 현재의 병렬 컴퓨팅의 대중화에 따른 병렬 어플리케이션 개발 이슈에 대한 내용의 글입니다.

Posted by hongiiv

2007/12/21 13:19 2007/12/21 13:19
, ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/293

정작 글의 내용은 별로 없는데 벌써 3편이네요, 저번 2편은 비공개글로 한 다음에 몇일에 걸쳐서 수정을 한 후 오늘 공개로 변경했는데 이글은 과연 언제쯤 공개로 될지 ^^

2편에 이어서 하드웨어 카운터를 기반으로 성능 분석을 가능하게 해주는 PAPI에 대해서 계속 알아보겠습니다.

(1) PAPI(Performance API)의 설치
PAPI가 지원하고 있는 있는 하드웨어와 운영체제는 거의 모두 지원하고 있다고 보시면 되겠습니다. 여기서는 당연히 X86기반의 리눅스 커널 2.6.X를 기준으로 작성하겠습니다. PAPI를 홈페이지에 다운로드 하고 설치하기 위해서는 커널에 대한 패치가 선행되어야 합니다.

(2) PAPI를 위한 커널 패치
Complete installation instructions are provided in the papi/src/perfctr-x.y directory. Please see the INSTALL file in that directory. x.y는 자신이 사용하는 리눅스 커널의 버전을 의미합니다. INSTALL 파일을 보면 커널 패치에 대한 내용이 나옵니다. 그럼 하나씩 살펴보도록 하겠습니다.

(3) 커널 패치와 커널 소스
자신의 버전에 맞는 커널 패치는 papi/src/perfctr-x.y/patches에 redhat과 suse 그리고 일반 커널에 대해서 버전별로 들어있다. 내가 사용하는 배포본은 fedora5(Kernel  2.6.15-1.2054_FC5)이기 때문에 fedora에서 제공하고 커널 소스도 다운로드(/usr/src/kernels/2.6.15-1.2054_FC5-i686)하였다.

(4) 커널 컴파일
커널 소스와 커널 패치가 준비되었으니 이제 커널에 패치를 하고 컴파일 해보도록 하자. 커널소스가 존재하는 디렉토리로 이동한 후 커널 패치가 존재하는 디렉토리의 update-kernel을 수행한다.
# cd /usr/src/kernel/2.6.15-1.2054_FC5-i686
#  /root/papi-3.5.0/src/perfctr-2.6.x/update-kernel

헉 에러가 난다. 2.6.15-1.2054_FC5 커널에 대한 패치가 없단다. 에러가 나면 다른 버전이지만 문제없이 잘 돌아갈만한 버전(patch-kernel-2.6.15)을 알려준다.
# /root/papi-3.5.0/src/perfctr-2.6.x/update-kernel --test --patch=2.6.15
테스트가 끝나면 --test 옵션을 빼고 실제 패치를 적용한다.
# /root/papi-3.5.0/src/perfctr-2.6.x/update-kernel  --patch=2.6.15

마지막으로,








Posted by hongiiv

2007/02/28 02:44 2007/02/28 02:44
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/162

들어가는말
단지 이미 만들어진 병렬 프로그램에 대해서 성능을 향상 시킨다는 의미만이 아니라 기존의 시리얼 프로그램에 대해서 병렬화하거나 병렬화 프로그램을 새롭게 작성하고자 할 경우 성능최적화, 성분분석, 프로그래밍 관련도구에 대한 지식은 많은 도움이 된다. ^^ 될 것이다.

지금까지의 병렬 프로그래밍 관련 포스트들은 다음과 같다.
리눅스 병렬 프로그래밍 - mpich
리눅스 병렬 프로그래밍 - pbs & loadleveler
고성능 컴퓨팅 환경에서의 병렬 프로그래밍의 성능 최적화

실제 병렬프로그래밍 기법이나, 병렬프로그램을 수행하기 위한 환경은 윗글들을 보면 도움이 될것이다. 여기서는 꼭 병렬 프로그램이 아니더라도 성분분석과 관련된 부분에 대해 언급하고자 한다.

솔직히 위에서 언급한 내용은 표면상의 이유이고 실제로는 매년 슈퍼컴퓨팅 경진대회를 KISTI에서 주최하고 있다. 공식행사명은 Supercomputing Challenger Award로 국내 슈퍼컴퓨팅 응용 연구개발 분야에서 슈퍼컴퓨팅 기술 활용 능력이 탁월한 연구자를 발굴하고, 관련 분야의 활성화 및 선도를 위해 개최되고 있는 행사에 한번 나가 보고 싶은 욕망 때문이다.

참가 항목은 크게 (1)성능 최적화 부문 (2) 고성능 컴퓨팅 부문으로 나뉘어 있다. 내가 관심을 갖는 부문은 고성능 컴퓨팅 부문으로 병렬화 및 최적화에 의한 최대성능을 구현해 내는 부문이다.

제출해야하는 서류는 참가신청서, 확인서, 코드 설명서, 슈퍼컴퓨터 시험 사용 약정서, 성능시험 결과표이다. 여기서 성능시험 결과표를 작성하기 위해서 hpmcount라는 유틸리티를 통해 측정된 값을 통해서 얼마만큼의 성능향상이 있었는지에 대한 내용을 제출하게 되어 있다.

그러나, 지금 당장 우리시스템에는 hpmcount가 없기 때문에 이를 대체할 만한 유틸리티를 필요로한다. 그래서 지금 이글을 쓰고 있는 것이다.

(1) 성능 시험 결과표 작성하기
병렬프로그램을 단일 프로세서에서 수행한 결과와 32프로세서에서 수행한 결과를 각각 제출하게 된다. 이를 바탕으로 Mflops(Mega FLoating-point Operation Per Second)값과 32CPU에서의 speedup({Wall clock time on 1 CPU}/ {wall clock time on 32 CPUs}을 가지고 평가를 하게 된다. 물론 단순한 성능 결과만이 아니라, 계산의 유용성, 사용기법의 적정성과 같이 병렬프로그램 자체가 학문적으로나 기술적으로 유용하고 의미있는 계산을 하는지, 문제 해결을 위해 적절한 알고리즘을 사용했는지에 대한 심사도 고려한다.

그럼 실제 hpmcount를 통해서 성능 시험 결과표를 작성하는 방법과 hpmcount를 대체하는 프로그램을 통해서 작성하는 방법을 예제의 병렬 프로그램을 통해서 알아본다.

(2) 성능분석 도구
1) hpmcount
IBM HPM(Hardware Performance Monitor) Toolkit은 물리적인 프로세서내의 하드웨어 이벤트 카운터에서 사용자가 필요한 정보를 얻을 수 있도록 해주는 라이브러리와 유틸리티의 모음으로 IBM alphaWorks에서 진행되다가 IBM High Performance Computing Toolkit이라는 상용 패키지의 한 부분이 되었다. HPM은 다양한 하드웨어 이벤트들을 측정할 수 있으며,  HPM의 한부분을 차지하고 있는 hpmcount는 사용자가 작성한 프로그램의 실제 실행 시간과 하드웨어 카운터에 관련된 정보, 사용 자원 등의 전반적인 성능을 제공한다.

현재 Power기반의 리눅스나 AIX에서 사용이 가능하며, 리눅스용 패키지는 Absoft Corp.에서 판매하고 있다.

2) hpmcount 실행
다음의 예제는 hpmcount를 통해  프로그램을 수행하는 LoadLeveler 스크립트로 시리얼 프로그램과 병렬 프로그램의 두가지 경우에 대한 예를 보여준다.

Sequential(Serial) program


Parallel program(MPI)
3) hpmcount를 통해 수집된 정보 분석
이 부분은 hpmcount를 현재 보유하고 있지 않기 때문에 단순히 서적이나 웹에서 얻은 자료를 기반으로 만들어진것을 미리 알리는 바입니다.

4) PAPI
hpmcount는 IBM의 PowerPC만을 지원하고 IRIX(리눅스의 지원여부는 확실히 모름^^)를 지원하기 때문에 다른 도구를 찾아야만 했다.

기본적으로 Flops를 측정하기 위해서는 CPU가 내부의 실수 연산 유닛의 작동 상황을 카운트해서 그정보를 제공해야 한다. CPU의 자체 카운터에 대한 성능 측정 프로그램에 대한 일반화를 위한 프로젝트가 있다. PAPI는 이러한 모니터링을 위한 공통적인 프로그래밍 인터페이스를 제공하며,  http://icl.cs.utk.edu/papi/index.html 에서 확인할 수 있다.

하악~ 힘들다. PAPI를 통한 성능 시험과 성능 시험 결과표 작성은 다음에 포스팅합니다.


Posted by hongiiv

2007/02/23 16:48 2007/02/23 16:48
, , , , , , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/161

scalapack

scalapack - parallel version of lapack - needs atlas3-base & blacs1-mpich & libmpich

Posted by hongiiv

2006/07/08 02:01 2006/07/08 02:01
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/127

이제 mpi 프로그래밍을 사용할 수 있는 환경이 마련되었다. 즉, 리눅스에서 병렬 프로그래밍이 가능해 졌다는 것이다. 그럼 이제 병렬 S/W를 만들고 실제 수행할 때 좀 더 심플하게 수행하도록 pbs나 loadleveler등의 스케줄러를 통해 실제 mpi 프로그램을 실행하도록 한다.

loadleveler script for parallel job (parallel.cmd)
[code c] #!/bin/bash # @ job_type = parallel # @ class = p_normal # @ input = /dev/null # @ step_name = parallel # @ output = $(step_name).$(cluster).out # @ error = $(step_name).$(cluster).err # @ resources = ConsumableCpus(1) # @ wall_clock_limit = 00:10:00 # @ node = 2 # @ tasks_per_node = 2 # @ queue echo "----------------------------------------------------" echo LOADL_STEP_ID=$LOADL_STEP_ID echo "----------------------------------------------------" ll_get_machine_list > /tmp/machinelist.$LOADL_SETP_ID machine_count=`cat /tmp/machinelist.$LOADL_SETP_ID | wc -l` echo $machine_count echo MachineList: cat /tmp/machinelist.$LOADL_SETP_ID echo "----------------------------------------------------" mpirun -np $machine_count -machinefile /tmp/machinelist.$LOADL_SETP_ID pi3 rm /tmp/machinelist.$LOADL_SETP_ID [/code]
pbs script for parallel job (parallel.cmd)

[code c] #!/bin/bash # PBS script mpich-mpi_job.pbs -> pbs script to submit a MPICH-MPI job. # Submit with "qsub -l nodes=#_of_nodes:ppn=1 mpich-mpi_job.pbs" # where #_of_nodes is the number of nodes you are requesting for # your MPICH-MPI job. ### Job name #PBS -N mpich-mpi_job ### Output files #PBS -o mpich-mpi_job.out #PBS -e mpich-mpi_job.err ### Queue name #PBS -q workq ### Script Commands cd $PBS_O_WORKDIR echo "Running MPICH-MPI program" # get the number of nodes allocated to MPICH-MPI through PBS NP=`(wc -l < $PBS_NODEFILE) | awk '{print $1}'` # run the MPICH-MPI program mpirun -machinefile $PBS_NODEFILE -np $NP ./mpich-mpi_program exit 0 [/code]

Posted by hongiiv

2006/07/04 16:48 2006/07/04 16:48
, ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/122

리눅스 병렬 프로그래밍 - mpich

리눅스에서 클러스터를 이용한 병렬프로그래밍(mpich)에 대한 내용은 인터넷을 조금만 찾아보면 아주 많은 문서들을 찾아 볼 수 있다. 다시한번 정리해보는 의미에서 여기에 남긴다. ^^;;

mpich 1.2.7p1이 지금 현재 최신버전으로 http://www-unix.mcs.anl.gov/mpi/mpich1/에서 다운로드하여 설치한다. 압축을 해제하고 다음의 configure,make,make install을 수행하기만 하면 된다.

/usr/local/mpich-1.2.7p1/share/machine.LINUX 파일에서 mpich를 수행할 노드 지정
/usr/local/mpich-1.2.7p1/example에 들어있는 예제들을 컴파일 하여 실행해본다. 여기서 모든 노드들은 패스워드없이 rlogin,rsh가 수행되어야 함은 물론 수행할 프로그램은 nfs와 같은 공유 디렉토리에 있든지 모든 노드의 동일한 위치에 있어야 한다. <-주의!!!!

프로그램 수행시 노드의 machine파일을 다음과 같이 지정해 줘도 된다.

mpi_test.c 소스

Posted by hongiiv

2006/07/04 16:12 2006/07/04 16:12
, , , ,
Response
A trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/121



야후 블로그 벳지


Site Stats

Total hits:
291448
Today:
55
Yesterday:
166