고 급   병 렬
This presentation is the property of its rightful owner.
Sponsored Links
1 / 146

고 급 병 렬 프 로 그 래 밍 PowerPoint PPT Presentation


  • 300 Views
  • Uploaded on
  • Presentation posted in: General

고 급 병 렬 프 로 그 래 밍 . 목 표. KISTI 가 현재 보유하고 있는 IBM 시스템에서 순차 및 병렬 프로그램의 성능을 최적화 시키기 위해 필요한 배경 지식을 습득하고 최적화와 관련해서 사용할 수 있는 도구의 사용법을 익히도록 한다. 차 례. I. 고급 병렬 프로그래밍 개요 4 II.IBM 시스템에서 성능 최적화 31 III. 병렬 프로그래밍 관련 도구106 IV. 참고 자료 및 부록145. 제 I 장. 고급 병렬 프로그래밍 개요

Download Presentation

고 급 병 렬 프 로 그 래 밍

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


2941468

고 급 병 렬

프 로 그 래 밍


2941468

목 표

KISTI가 현재 보유하고 있는 IBM 시스템에서 순차 및 병렬 프로그램의 성능을 최적화 시키기 위해 필요한 배경 지식을 습득하고 최적화와 관련해서 사용할 수 있는 도구의 사용법을 익히도록 한다.


2941468

차 례

I.고급 병렬 프로그래밍 개요 4

II.IBM 시스템에서 성능 최적화 31

III.병렬 프로그래밍 관련 도구106

IV.참고 자료 및 부록145


2941468

제 I 장

  • 고급 병렬 프로그래밍 개요

    • 병렬 프로그램의 성능최적화

    • 일반적인 프로그램의 튜닝

    • 가이드라인

    • 하이브리드 병렬 프로그래밍


2941468

순차 프로그램의 실행시간

병렬 프로그램의 실행시간(n개 프로세서)

24

8

ts

tp

S(n)=

=

S(4)=

= 3

병렬 프로그램의 성능최적화 (1/5)

  • 성능향상도(speed-up) S(n)

    • 순차 프로그램에 대한 병렬 프로그램의 성능향상 정도

    • 실행시간(elapsed time)은 벽시계시간(wall clock time) 기준

    • 실행시간이 24시간소요되는 순차 프로그램을 병렬화, 4개 프로세서를 사용해서 8시간 만에 결과를 얻을 수 있게 된 경우의 성능향상도


2941468

ts

fts + (1-f)ts/n

1

f+ (1-f)/n

S(n)=

=

ts

tp

=

Sideal =

1

f

병렬 프로그램의 성능최적화 (2/5)

  • Amdahl’s Law

    • ‘병렬프로그램의 성능향상도는 순차 프로그램에서 병렬화 가능한 부분의 비율에 의해서 결정된다.’

    • 이상(ideal) 성능향상도 Sideal

      tp = fts + (1-f)ts/n

      여기서, f는 병렬화 불가능한 부분이며 0 ≤ f ≤ 1

      만일, 프로세서를 충분히 많이(n  ∞) 사용한다면,


2941468

20

80

Serial

1

0.2 + (1-0.2) / 4

= 2.5

S(4)=

20

20

Parallel

process 1

process 2

process 3

cannot be parallelized

process 4

can be parallelized

병렬 프로그램의 성능최적화 (3/5)

  • 이론 성능향상도

    • f = 0.2, n = 4


2941468

20

80

Serial

20

20

parallel

process 1

cannot be parallelized

process 2

can be parallelized

process 3

communication overhead

process 4

Load unbalance

병렬 프로그램의 성능최적화 (4/5)

  • 실제 성능향상도

    • 실제의 경우 통신부하, 부하분산 불균형이 성능향상도에 영향을 미침


2941468

ts

tpx n

S(n)

n

E(n)=

=

[ x 100 (%) ]

병렬 프로그램의 성능최적화 (5/5)

  • 병렬 프로그램의 효율(efficiency) E(n)

    • 프로세서 사용 개수에 따른 병렬 프로그램의 성능 효율

    • 4개의 프로세서로 3배의 성능향상이 있는 경우 0.75 혹은 75%의 병렬 프로그래밍 효율

  • 병렬 프로그램의 성능 향상을 위한 가이드라인

    • 순차 프로그램에서 병렬화 될 수 있는 부분을 증가시킴

    • 병렬 프로세스들의 부하분산을 고르게 함

    • 통신에 소요되는 시간을 최소화 시킴


2941468

일반적인 튜닝 가이드라인 (1/14)

  • 코드의 핸드 튜닝

    • 지역변수와 전역변수

      • 전역변수는 변수의 범위(scope) 특성 때문에 컴파일러의 최적화 방해

      • 최대한 자동변수(automatic variable)과 같은 지역변수를 많이 사용

    • 포인터

      • 최적화 과정에서 포인터를 쫓는 것은 어렵거나 불가능하기 때문에 대부분의 메모리 관련 최적화를 방해

    • 수식의 표현

      • Fortran 컴파일러는 동일 수식은 잘 인지하지만, 교환법칙을 이해하지는 못함

        • x = a + b + c + d

        • y = a + c + b + d

      • 가능하면, 동일한 수식을 표현할 때의 변수들은 동일 순서로 배열


2941468

일반적인 튜닝 가이드라인 (2/14)

  • 형 변환

    • 정수와 실수 간의 형 변환을 강제하지 말 것

    • 루프 변수로 부동소수를 사용하지 말 것

  • 루프의 튜닝

    • Do 루프의 크기를 관리하기 쉽게 유지

    • 데이터를 순차적으로 접근 – 스트라이드(stride) 1

    • 이동 불가능한 루프 안의 IF문 수를 최소화

    • 루프 안에서의 서브루틴/함수 부르기를 피할 것

    • 배열의 subscript(특히 루프 변수) 단순화

    • 정수형 루프 변수 사용

    • 루프 안에서 피해야 할 구문

      • - GOTO, STOP, PAUSE, RETURN 같은 흐름 관련 구문

      • - 루프의 최적화를 방해하는 데이터의 EQUIVALENCE 구문

      • - LOGICAL*1, BYTE, INTEGER*1, INTEGER*2, REAL*16, COMPLEX*32, CAHRACTER, INTEGER*8 같은 최적화 불가능한 데이터 형을 피할 것


2941468

일반적인 튜닝 가이드라인 (3/14)

  • 성능에 치명적인 루프에서 피해야 할 것들

    • 큰 스트라이드의 데이터 접근

    • 적은 수의 반복계산을 수행하는 루프

    • I/O 문의 포함

  • 루프 튜닝의 예

    • IF 문의 제거

    • 경계조건 IF 테스트

    • 반복적인 내재(intrinsic) 함수의 계산

    • 나눗셈을 역수의 곱셈으로 치환

    • 2의 승수의 배수를 갖는 배열 문제


2941468

일반적인 튜닝 가이드라인 (4/14)

  • IF 문의 제거


2941468

일반적인 튜닝 가이드라인 (5/14)

  • 경계조건 IF 테스트


2941468

일반적인 튜닝 가이드라인 (6/14)

  • 반복적인 내재(intrinsic) 함수의 계산


2941468

일반적인 튜닝 가이드라인 (7/14)

  • 나눗셈을 역수의 곱셈으로 치환


2941468

일반적인 튜닝 가이드라인 (8/14)

  • 2의 승수의 배수를 갖는 배열 문제


2941468

일반적인 튜닝 가이드라인 (9/14)

  • 튜닝된 코드의 사용

    • 이미 튜닝된 작업에 시간을 허비하지 말 것

    • 배열연산, 선형 대수 방정식의 풀이, BLAS 함수, FFT, convolution 등과 같은 표준 함수들을 코드에서 사용한다면 대응되는 ESSL 함수를 사용하도록 코드를 수정

  • 성능 모니터링

    • POWER3, POWER4 프로세서는 하드웨어 성능 모니터링 장치 포함

    • 프로세서의 동작이나 명령의 처리와 관련된 자세한 정보를 담은 카운터에 대한 접근을 OS 차원에서 제공

    • Performance Monitor API 패키지

      $ lslpp –l bos.pmapi.*

    • Performance Monitor API와 HPM Toolkit을 이용해서 프로그램의 성능 모니터링에 필요한 관련 카운터의 정보를 얻을 수 있음


10 14

일반적인 튜닝 가이드라인 (10/14)

  • PM API 테스트

    $ xlc -O3 -c -o pm_subroutines.o pm_subroutines.c

    $ xlf -O3 -o pm_test pm_subroutines.o -lpmapi -L/usr/pmapi/lib pm_test.f

    * Counter 1 – L3, 2 – memory, 3 – L3.5, 4 – L2, 5 – L2P1S, 6 – L2P2S, 7 – L2P1, 8 – L2P2


11 14

일반적인 튜닝 가이드라인 (11/14)

  • I/O를 위한 튜닝

    • 가능한 한 I/O를 제거하거나 줄여라

    • I/O가 프로그램의 병목(bottleneck)이라면 우수한 하드웨어나 소프트웨어를 사용하는 것이 최선의 튜닝 방법

      • High-performance storage arrays, 스트라이핑, asynchronous I/O

    • Asynchronous I/O

      • 계산과 I/O가 동시에 실행될 수 있도록 OS(AIX)가 지원

      • Asynchronous I/O를 위해서는 프로그램의 수정이 필요 함

      • Fortran – OPEN() 문에서 ASYNC 인자를 이용, asynchronous read/write를 위한 wait 필요

      • C – asynchronous I/O는 unbuffered I/O에서만 지원, Fortran의 경우보다 복잡함

    • Direct I/O : 장치와 어플리케이션 버퍼들의 사이 중간(intermediate) 버퍼링을 하지 않고 I/O 데이터를 전송


12 14

일반적인 튜닝 가이드라인 (12/14)

  • Fortran I/O

    • I/O 서브시스템에 대한 호출 횟수를 줄임

      • DIMENSION A(N,N)

      • Case 1. Best. N*N개 값의 1개 레코드

      • WRITE(1) A

      • Case 2. N개 값의 N개 레코드

      • DO I = 1, N

      • WRITE(1) (A(J,I), J = 1, N)

      • ENDDO

      • Case 3. Worst. 1개 값의 N*N개 레코드

      • DO I = 1, N

      • DO J = 1, N

      • WRITE(1) A(J,I)

      • ENDDO

      • ENDDO

    • 순차적으로 읽거나 쓸 때 길이가 긴 레코드를 이용, 적어도 100KB이상 2MB 혹은 그 이상 단위의 I/O가 효율적


13 14

일반적인 튜닝 가이드라인 (13/14)

  • Formatted 대신 Unformatted I/O 사용 : binary  decimal 변환의 오버헤드 감소

  • Sequential 대신 direct file 사용 : Fortran 레코드 길이와 오버플로우 체크를 피함

  • 계산과 I/O 작업을 겹쳐서 수행하기 위해 asynchronous I/O를 사용

  • AIX는 자동적으로 여유 메모리를 파일 I/O의 버퍼로 사용  큰 크기의 임시 파일을 sequential하게 쓰고 처리 과정의 추후 단계에서 그 파일을 다시 읽어야 할 필요가 있다면, direct access 파일로 만들고 끝부분의 레코드를 먼저 읽도록 시도. 이상적으로는 역순으로 읽어라  메모리 버퍼에 남아 있는 파일 부분에 대해서 디스크를 읽지 않고 I/O 작업 가능

  • 핫스팟(hot spot) 찾기 – 프로파일링

    • 프로파일링

      • 프로그램의 실행 중 전체 코드에 걸쳐서 CPU 시간이 어떻게 사용되었는지를 알려 줌

      • 프로그램을 가장 효과적으로 튜닝할 수 있는 서브루틴이나 루프를 밝혀 줌


  • 14 14

    일반적인 튜닝 가이드라인 (14/14)

    • 특정 프로파일링은 프로그램의 특정 실행과 연관되어 있으며, 같은 프로그램이라도 입력 파일에 따라서도 다른 프로파일링 결과를 나타냄

  • 프로파일링 도구

    • prof, gprof : 프로시져 수준의 프로파일링

    • tprof: 10 milliseconds 단위로 프로그램의 실행을 가로챌 수 있는 AIX trace 장치 사용, 결과 trace 테이블로부터 소스 코드의 라인별 10 milliseconds 틱(tick)의 수를 표시

  • tprof

    • -g 옵션을 추가하고 프로그램 컴파일

    • tprof 명령을 이용해서 프로그램을 실행

      • $ tprof –p myprog –x “myprog params”

      • __myprog.all : 프로그램을 실행시키는데 관여한 모드 프로세스 정보 및 각 프로세스와 연관된 시간 틱 수 등 표시

      • __t.myprog.f : -g 옵션을 사용한 경우만 생성, 소스 코드의 라인별 틱 수를 표시

  • xprofiler

    • prof, gprof, tprof의 기능을 포함한 XGUI 프로파일러


  • 2941468

    하이브리드 병렬 프로그래밍 (1/7)

    • 동기와 필요성

      • 성능 향상을 위해서

        • 노드 내에서의 MPI 사용으로 인한 통신의 초기 지연 방지

        • 다중 프로세스 실행으로 인해 발새하는 노드 내에서의 불필요한 데이터 복사 방지

        • 노드간의 MPI 콜로 인한 통신 지연 감소

        • 전체적인 메시지 패싱 작업 감소

      • 메모리 사용을 줄이기 위해서

        • 다중 프로세스 실행으로 인해 노드 내에서 중복되는 데이터 복제 방지


    2941468

    하이브리드 병렬 프로그래밍 (2/7)

    • 하이브리드 병렬 프로그래밍 과정


    2941468

    병렬화 접근 방식의 형태

    Fine Grained

    main program

    ! MPI initialization

    ....

    ! CPU intensive loop

    !$OMP PARALLEL DO

    do i=1,n

    !work

    end do

    ....

    end

    Coarse Grained

    main program

    !MPI initialization

    !$OMP PARALLEL

    ....

    do i=1,n

    !work

    end do

    ....

    !$OMP END PARALLEL

    end

    하이브리드 병렬 프로그래밍 (3/7)


    2941468

    하이브리드 병렬 프로그래밍 (4/7)

    • 병렬화 접근 방식에 따른 특성

      • Fine Grained

        • 적용하기 용이

        • OpenMP 지시어를 사용하게 되고, 그에 따라 fork-join 되기 때문에 스레드 생성 및 동기화 인해 발생하는 부하가 성능 저조에 영향

      • Coarse Grained

        • 상대적으로 복잡하므로 적용하는데 많은 시간이 소요 됨

        • 스레드 생성으로 인한 부하가 적음


    2941468

    하이브리드 병렬 프로그래밍 (5/7)

    • Fine Grained 접근 방식


    2941468

    하이브리드 병렬 프로그래밍 (6/7)

    • Coarse Grained 접근 방식

      • MPI 코드에서 시작

      • 각 MPI 테스크가 시작 부분에서 스레드들을 한번 생성

      • 초기화 같은 순차 작업이나 MPI 콜들은 MASTER 혹은 SINGLE 지역에서 수행

      • 메인 배열은 전역변수

      • 작업 분배 : 각 스레드는 그 스레드 번호(omp_get_thread_num())에 따라 배열 데이터의 조각을 담당. 1차원 블록 분배.

      • OMP DO를 사용치 않음

      • 변수 및 함수의 유효 범위(scope)와 동기화(synchronization)에 주의


    2941468

    하이브리드 병렬 프로그래밍 (7/7)

    • 적용 경우

      • MPI로 확장성이 우수하지 않는 경우

      • 동적 부하 분산(dynamic load balancing)을 이용할 수 있는 경우

      • Fine-grained 병렬성을 갖고 있는 경우

      • 중복된 데이터를 갖고 있는 경우

      • 노드 내 통신에 적합한 MPI가 없는 경우

    • 현실적 제약

      • 성능 향상이 크지 않거나 저하

      • 프로그래밍이 어려움


    2941468

    제 II 장

    • IBM 시스템에서성능 최적화

      • POWER4 프로세서를 사용하는 KISTI IBM 시스템에서의 최적화 방법

      • POWER4 시스템을 위한 튜닝, 컴파일러를 이용한 최적화, 병렬 프로그래밍 테크닉


    Power4 1 11

    POWER4 시스템 (1/11)

    • IBM POWER 프로세서의 발전

      • POWER1

        • 1990년, 25MHz, 8KB I-캐시, 64KB D-캐시, FMA, 50MFlops

      • POWER2

        • 1993년, 55-66.5MHz, 1996년 P2SC 135~160MHz, 256KB D-캐시, 이중 FPU/FXU, 하드웨어 제곱근, 650MFlops

      • PowerPC

        • 1993년, IBM+Motorola+Apple, POWER instruction+SMP, 601/603/604/604e로 발전, POWER3/4의 기반

      • RS64

        • 1997년, 64비트, 24-way SMP, 상용(1FPU), 750MHz, Copper/SOI기술

      • POWER3

        • 1999년, P2SC+PowerPC, FP성능+SMP+64비트, 200/375/450MHz, 16-way SMP, Copper/SOI기술, ASCI White, 서울대


    Power4 2 11

    POWER4 시스템 (2/11)

    • IBM POWER4 프로세서의 특징

      • 2001년 발표

      • 2 마이크로프로세서 코어

      • MCM (Multi-Chip Module) : 4 칩 / 8 코어

      • SCM (Single-Chip Module) : 1 칩 / 2 코어

      • CPU 속도: 1.1 / 1.3 / 1.7 / 2.0 GHz

      • 32웨이 SMP 가능: 4 MCM

      • 64비트

      • 캐시: L1 (코어) / L2 (칩) / L3 (모듈)


    Power4 3 11

    POWER4 시스템 (3/11)

    • POWER4 프로세서 칩


    Power4 4 11

    POWER4 시스템 (4/11)

    • POWER4 프로세서 코어


    Power4 5 11

    POWER4 시스템 (5/11)

    • POWER4 프로세서 실행 파이프라인


    Power4 6 11

    POWER4 시스템 (6/11)

    • POWER4 메모리 체계의 구조와 용량


    Power4 7 11

    POWER4 시스템 (7/11)

    • MCM과 POWER4 메모리 체계의 연결


    Power4 8 11

    POWER4 시스템 (8/11)

    • MCM과 MCM 사이의 연결


    Power4 9 11

    POWER4 시스템 (9/11)

    • 메모리 체계와 MCM들 사이의 연결


    Power4 10 11

    POWER4 시스템 (10/11)

    • 하드웨어 데이터 프리패치(prefetch)

    • 캐시 미스(miss)의 영향

      • 각 메모리 구성 요소로부터 1워드(word) 로드(load) 소요 시간

        L1 : 1 CPU 사이클,L2 : ~12 CPU 사이클

        L3 : ~100 CPU 사이클,메모리 : ~300 CPU 사이클(latency 포함)


    Power4 11 11

    POWER4 시스템 (11/11)

    • POWER4 시스템 I/O 구조


    2941468

    수치 어플리케이션을 위한 튜닝 (1/2)

    • 수치 어플리케이션을 위한 튜닝 과정

      • I/O가 프로그램의 중요 부분이라면 이 부분을 따로 튜닝하는 것이 중요하며 계산 부분의 튜닝과는 별개의 과정임

      • 최고의 컴파일러 최적화 옵션을 사용

      • 프로파일링을 통해서 프로그램에서의 핫스팟 찾기

        • 이 과정은 매우 중요하며, 프로그램에서 자주 실행되지 않는 부분을 튜닝하는데 시간을 허비하지 말 것

      • 가능하면 MASS 라이브러리나 ESSL 혹은 다른 성능에 최적화된 라이브러리를 사용

      • 일반적으로 사용하는 프로그램의 작성과 관련된 튜닝 가이드라인을 따라서 프로그램을 튜닝

      • POWER4 시스템에 적합하도록 핸드 튜닝


    2941468

    수치 어플리케이션을 위한 튜닝 (2/2)

    • 수치 어플리케이션의 핸드 튜닝

      • 부정적 요인을 피하기

        • 수치 연산 장치보다 느린 메모리 시스템의 부정적 효과를 피하거나 최소화 시키기 위한 방편

        • 스트라이드 최소화

        • 데이터 프리패칭의 흐름이 잘 이루어지도록 튜닝

        • 캐시의 세트조합성(set associativity) 구속을 회피

        • 데이터 캐시 블로킹(blocking)

      • 긍정적 요인을 이용

        • 특히, 부동소수점 연산장치와 같은 수치 연산 장치의 활용 효율을 극대화 시키기 위한 방편

        • 안쪽 루프의 언롤링(unrolling) : 루프의 반복 당 독립 연산의 수를 증가시켜 파이프라인을 채움

        • 바깥쪽 루프의 언롤링 : 로드(load), 스토어(store)에 대한 연산 명령어의 비율을 증가시켜 루프의 성능이 데이터의 이동보다 연산에 의존토록 조정


    2941468

    캐시 메모리를 위한 튜닝 (1/17)

    • 레벨 1, 2, 3 캐시

      • L1 명령어 캐시

        • 64KB / 프로세서

        • 수치 어플리케이션의 경우 보통 처리해야 할 데이터의 양이 명령어의 흐름이 차지하는 것보다 훨씬 크기 때문에 L1 명령어 캐시는 큰 영향을 미치지 않음

        • 엑티브(active) 루프가 너무 많은 명령어를 포함하지 않도록 주의

          • 엑티브 루프 : Fortran의 DO루프, C의 for루프

      • L1 데이터 캐시

        • 32KB / 프로세서

        • FIFO(first-in-first-out) 교체 알고리즘의 2웨이 세트 조합성

      • L2 캐시, L3 캐시

        • L2 : 1440KB / 칩, L3 : 128MB/MCM

        • 캐시의 일관성(coherency)은 L2 레벨에서 시스템 전체에 걸쳐 유지


    2941468

    캐시 메모리를 위한 튜닝 (2/17)

    • 일반적인 캐시 고려 사항

      • L2 캐시에서 L1 캐시로의 대역폭(bandwidth)은 부동소수점 연산장치에 데이터를 원활히 공급해 주기에 충분

      • 성능관점에서 L1 캐시와 L2 캐시의 가장 큰 차이점은 지연(latency)

      • L1 캐시와 부동소수점 레지스터(register) 사이의 지연 : ~4 cycles

      • L2 캐시와 부동소수점 레지스터 사이의 지연 : ~14 cycles

      • 조밀(dense) 행렬 연산에 대한 추천

        • L2 캐시에 대한 데이터 블로킹

        • L1 캐시에 대한 데이터 접근 조직화

    • L1 데이터 캐시의 구조

      • 캐시 라인(cache line)

        • 개념상 메모리 혹은 캐시를 128바이트 단위의 연속으로 나눈 것

        • 메모리와 캐시 사이에서의 데이터 전송 단위


    2941468

    캐시 메모리를 위한 튜닝 (3/17)

    • 세트 조합성(set associativity)

      • 2웨이 세트 조합성을 갖는 128개의 합동(congruence) 클래스 구조

      • 2 x 128 x 128바이트 = 32KB


    2941468

    캐시 메모리를 위한 튜닝 (4/17)

    • POWER4 프로세서의 L1 데이터 캐시의 세트 조합성 관련 특성

      • 합동(congruence) 클래스 : L1 데이터 캐시 구조 그림에서의 동일 칼럼을 이루는 캐시 라인들의 집합

      • 2웨이 세트 조합성, 128 합동 클래스

      • 메모리와 캐시 사이의 로드/스토어는 같은 합동 클래스 상의 캐시 라인들 사이에서만 허용

      • 메모리 상의 128바이트 크기 메모리 라인은 2곳의 캐시 라인 중 한 곳으로만 로드 가능

      • 실질적으로 유효한 L1 데이터 캐시의 크기를 감소시키는 효과

      • 16KB의 배수로 메모리 요소를 접근할 경우 POWER4 프로세서 L1 데이터 캐시 활용 면에서 최악의 상황 초래


    2941468

    캐시 메모리를 위한 튜닝 (5/17)

    • 스트라이드 최소화

      • 스트라이드 값이 1 혹은 작음으로 인한 데이터의 순차 접근은 캐시의 활용 및 하드웨어 프리패칭 흐름 관점에서 이득

      • 데이터가 캐시 라인에 로드되면 16개의 배정도(double precision) 워드(word) 혹은 32개의 단정도(single precision) 워드가 한 개의 캐시 라인을 차지, 데이터 접근 단위를 나타내는 스트라이드 값이 배정도의 경우 16, 단정도의 경우 32인 경우 한 개의 캐시 라인에서 한 개의 워드만을 접근해서 사용하게 되고, 추후 동일 캐시라인 내의 데이터를 접근하려 할 때 캐시 미스(miss) 발생 확률 높음

      • 데이터에 대한 스트라이드 1 혹은 –1의 순차접근만이 8개의 하드웨어 프리패칭 흐름 중 하나를 가동할 수 있음

      • Fortran의 경우 열 우선순서 접근, C의 경우 행 우선 순서 접근이 유리함


    2941468

    캐시 메모리를 위한 튜닝 (6/17)

    • 스트라이드 최소화 예

      • Fortran

        DO J = 1, N

        DO I = 1, N

        A(I,J) = A(I,J) + B(I,J)*C(I,J)

        ENDDO

        ENDDO

      • C

        for (i=0; i<n; i++)

        for (j=0; j<n; j++) {

        a[i][j] += b[i][j]*c[i][j];

        }


    2941468

    캐시 메모리를 위한 튜닝 (7/17)

    • 보통의 경우 : 루프 내의 모든 배열을 스트라이드 1로만 접근하는 것은 어려우며 이런 경우 데이터 캐시 블로킹 방법의 적용이 필요함


    2941468

    캐시 메모리를 위한 튜닝 (8/17)

    • 데이터 프리패칭 흐름 튜닝

      • POWER4 프로세서에서는 데이터 프리패칭이 하드웨어를 이용해서 이루어짐

      • 데이터 프리패칭 장치를 효과적으로 활용하기 위한 튜닝

        • 프로그램의 성능에 많은 영향을 주는 루프에서 너무 많거나 적은 수의 프리패칭 흐름을 적절한 수로 조절

        • 프로그램의 성능에 많은 영향을 주는 루프에서 프리패칭 흐름의 길이(루프의 반복회수)를 너무 짧지 않게 조절

      • 루프내의 프리패칭 흐름의 수 조절 방법

        • 루프 내에 4개 ~ 8개의 하드웨어 프리패칭 흐름에 최적화 되어 있음

        • 인접 루프들의 융합(fusing) : -qhot 컴파일러 옵션으로 가능

        • 루프의 중간지점 양분(midpoint bisection)


    2941468

    캐시 메모리를 위한 튜닝 (9/17)

    • 데이터 프리패칭 흐름 튜닝 예

      • 인접 루프의 융합


    10 17

    캐시 메모리를 위한 튜닝 (10/17)

    • 루프의 중간지점 양분


    11 17

    캐시 메모리를 위한 튜닝 (11/17)

    • 데이터 프리패칭 흐름의 수에 따른 POWER4 데이터 전송률


    12 17

    캐시 메모리를 위한 튜닝 (12/17)

    • L1 캐시의 세트 조합성의 특성 고려

      • 배열의 주요 차원(leading dimension)을 2의 고 제곱의 배수로 정하지 말 것

      • L1 캐시의 세트 조합성 특성 고려 예

        • 튜닝 전 : 2048 x REAL*8 = 16 KB, 총 75 캐시 라인 접근, 모든 캐시 라인이 같은 합동 클래스에 존재, 2웨이 세트 조합성을 갖는 L1 데이터 캐시에서 오직 2개의 캐시 라인만 활용 가능

        • 개선 방법 : 배열의 주요 차원을 2064(2048+16, 캐시 라인 길이), 2056( 2048+8, 캐시 라인 반 길이), 2046(2048–2) 등의 크기로 정의


    13 17

    캐시 메모리를 위한 튜닝 (13/17)

    • 데이터 캐시 블로킹

      • 처리할 데이터(배열)가 너무 커서 캐시에 맞지 않으면캐시에 맞는 크기의 블록들로 나누어서 처리하는 것

      • POWER4 시스템에서는 1440KB 크기의 L2 캐시를 맞출 대상으로 함

      • 블로킹의 효과 여부를 결정짓는 두 가지 요소

        • 스트라이드 1 : 모든 데이터가 스트라이드 1로 접근되는지의 여부

        • 데이터 재사용 : 각 데이터 요소들이 하나 이상의 산술 연산에서 사용되는지의 여부

      • 블로킹의 효과 결정 요소의 조합에 따른 효과 여부

        • 스트라이드 1, 데이터 재사용 없을 경우 : 블로킹 이득 없음


    14 17

    캐시 메모리를 위한 튜닝 (14/17)

    • 일부 배열 스트라이드 1 아니고, 데이터 재사용 없을 경우 : 어느 정도 블로킹 이득 있음

    • 스트라이드 1, 많은 데이터 재사용의 경우 : 어느 정도 블로킹 이득 있음


    15 17

    캐시 메모리를 위한 튜닝 (15/17)

    • 일부 배열 스트라이드 1 아니고, 많은 데이터 재사용의 경우 : 블로킹 필수이며, 컴파일러 옵션을 사용하지 않고 일반적으로 수동 튜닝

    • 블로킹 예

      • 블록의 크기 = NBxNB 요소 수

      • 이 예에서 블로킹이 효과적으로 되기 위해서는 세 개의 NBxNB 블록들이 L2 캐시에 동시에 로드될 수 있도록 NB의 크기가 결정되어야 함

      • POWER4 칩의 경우 두 개의 프로세서가 L2를 공유하므로 NB 크기의 결정이 좀 더 복잡해 짐


    16 17

    캐시 메모리를 위한 튜닝 (16/17)

    • 블로킹 예


    17 17

    캐시 메모리를 위한 튜닝 (17/17)

    • N 바이트의 임의 데이터를 접근하기 위한 지연 사이클


    Fpu 1 13

    FPU를 위한 튜닝 (1/13)

    • POWER4 FPU의 특성

      • 2FPU / 프로세서

      • 2개의 FPU가 L1 캐시, 72개 실제(physical) 64비트 부동소수점 레지스터 공유

      • 어셈블러 프로그램에서는 renaming을 통해 72개의 실제 레지스터에 대응되는(mapped) 32개의 논리(architected) 레지스터를 사용해서만 부동소수점 연산을 수행

      • 모든 부동소수점 연산은 논리적으로 부동소수점 레지스터만을 사용하는 레지스터 대 레지스터 연산 동작

      • 단정도변수도 배정도 변수와 동일한 64비트 레지스터 사용

      • 기본 부동소수점 연산은 배정도 FMA(multiply/add) 연산

        • 곱셈과 덧셈 연산을동시에 수행하며 빼기, 음수 및 단정도 변형 포함

        • 연산부분에서 6사이클 소요, 슈퍼스칼라 파이프라이닝 시 1사이클 소요

        • 최악의 경우 – 1FMA / 6사이클, 최고의 경우 – 2FMA / 사이클


    Fpu 2 13

    FPU를 위한 튜닝 (2/13)

    • POWER3 프로세서에서 FPU의 슈퍼스칼라 파이프라인


    Fpu 3 13

    FPU를 위한 튜닝 (3/13)

    • 기타 부동소수점 연산

      • 덧셈, 뺄셈, 곱셈 연산은 FMA 연산으로 변환, 같은 처리 시간 소요

      • 부동소수점 나눗셈 연산 : 슈퍼스칼라 파이프라인을 이용하지 않음


    Fpu 4 13

    FPU를 위한 튜닝 (4/13)

    • 최고의 GFlops를 위한 수치 연산 루프의 조율 방법

      • L1과 L2 캐시 내에서 효율적으로 동작하도록 조정

      • 나눗셈, 제곱근, 함수 호출 등을 금지

      • 루프 내에 FMA 연산만 포함하도록 조정

      • FMA연산들을 독립적이고, 깊이 6의 FMA 연산 파이프라인 두 개를 채우기 위해서 12개 이상 포함하도록 조정

      • 루프가 FMA에 한정(bound)되도록 조정

        • FMA 연산에 소요되는 사이클과 FMA 이외의 연산에 소요되는 사이클을 비교

        • RISC 프로세서의 특성상 FMA 이외의 연산들이 FMA 연산과 동시에 실행될 것이므로, FMA 연산에 소요되는 사이클 수와 동일하거나 더 적게 수행되도록 조정하여 전체 연산이 FMA 연산에 의해 한정되도록 조정


    Fpu 5 13

    FPU를 위한 튜닝 (5/13)

    • FPU를 위한 튜닝

      • 캐시 메모리를 위한 튜닝과는 다르게 컴파일러에 의해서 최적화

      • 안쪽 루프의 언롤링

        • FPU 파이프라인을 최대한 활용할 수 있도록 튜닝

        • 루프 내에 적어도 12개의 독립적인 FMA 연산이 포함되어야 함

        • L1 캐시 지연을 극복하기 위해 명령어 흐름 상 로드가 FMA보다 적어도 4사이클 정도선행되도록 조정

        • 로드와 스토어의 수가 FMA 연산의 수보다 작거나 같아야 하며, 그렇지 않으면 로드/스토어 시간이 지배적이 됨

        • 수동 언롤링을 할 때는 –qnounroll 옵션으로 컴파일러와의 중복을 방지하고, 보통은 컴파일러에 의해서 자동으로 최적화할 수 있음

      • 바깥쪽 루프의 언롤링

        • 로드+스토어에 대한 FMA 연산의 비를 증가시키고자 할 때 사용

        • 데이터 재사용의 경우에 적용 가능하며, 보통 수동으로 언롤링


    Fpu 6 13

    FPU를 위한 튜닝 (6/13)

    • 바깥쪽 루프 언롤링의 예 1

      • 튜닝 전

        • 스트라이드 1이 되도록 잘 작성되었으나, 로드+스토어 연산에 한정됨

        • 컴파일러가 안쪽 루프를 언롤링해도 FMA 연산에 한정되지 않음

          • 안쪽 루프 4회 : 8로드(X(J), A(J,I)), 0스토어, 4FMA

        • 수동으로 바깥쪽 루프를 언롤링해서 FMA 연산에 한정되도록 조정해야 함


    Fpu 7 13

    FPU를 위한 튜닝 (7/13)

    • 튜닝 후

      • 루프 언롤링 깊이(depth) 4까지 튜닝한 예

      • 로드+스토어 연산에 대한 FMA 연산의 비가 튜닝 전보다 증가 됨

        • 안쪽 루프 4회 : 5로드(X(J), A(J,I)…A(J,I+3)), 0스토어, 4FMA


    Fpu 8 13

    FPU를 위한 튜닝 (8/13)

    • 바깥쪽 루프 언롤링의 효과(행렬-벡터 곱, 1.1GHz)


    Fpu 9 13

    FPU를 위한 튜닝 (9/13)

    • 바깥쪽 루프 언롤링의 예 2

      • 행렬 곱에 대한 MxN 언롤링

      • 튜닝 전

        • 행렬 곱 알고리즘의 루프에서 데이터 캐시 블로킹 테크닉을 적용한 코드가 복잡하게 보이는 것은 줄이기 위해 블로킹 루프는 제외시키고 캐시에 들어가는 부분만 표시

        • 로드+스토어 연산에 한정됨

          • 안쪽 루프 : 2로드(A(J,K), B(K,I)), 0스토어, 1FMA


    Fpu 10 13

    FPU를 위한 튜닝 (10/13)

    • 튜닝 1 : 임시 변수의 도입

      • 개선된 듯 보이지만, 안쪽 루프에서 보면 튜닝 전과 별 차이 없음

      • 로드+스토어에 한정됨


    Fpu 11 13

    FPU를 위한 튜닝 (11/13)

    • 튜닝 2 : 5x4 언롤링 (1/3)


    Fpu 12 13

    FPU를 위한 튜닝 (12/13)

    • 튜닝 2 : 5x4 언롤링 (2/3)


    Fpu 13 13

    FPU를 위한 튜닝 (13/13)

    • 튜닝 2 : 5x4 언롤링 (3/3)

      • 안쪽 루프 : 9로드(A(J+0,K)…A(J+3,K), B(K,I+0)…B(K,I+4)), 20FMA

      • 29 부동소수점 레지스터 사용

      • 행렬의 인수분해(factorization)에서도 유사한 방법 적용 가능

      • ESSL의 DGEMM() 함수도 비슷한 최적화 방법을 적용


    2941468

    컴파일러를 이용한 최적화 (1/15)

    • 최적화 레벨 옵션

      • 컴파일러를 사용하는데 있어서 가장 흔히 사용하는 옵션

      • 시스템 혹은 컴파일러 제조업체마다 약간의 차이가 있지만, 보통 -O로 시작하며 -O0, -O2 및 -O3 정도는 공통적으로 유사한 의미로 사용

      • -qoptimize=n 혹은 -On으로 지정하며, n은 다음 중의 한 가지 값

        • 0 : 빠른 컴파일 및 완전한 디버깅 지원

        • 2 : 저수준의 최적화를 수행하며, 프로시저 경계에 한하는 부분적인 디버깅 지원

        • 3 : 레벨 2보다 더 많은 최적화를 수행하며, 긴 컴파일 시간과 시스템자원을 소모 함. 매크로가 아닌 경우의 최고 최적화 레벨

        • 4 : ‘-O3 -qhot -qipa -qarch=auto -qtune=auto –qcache=auto’매크로

        • 5 : ‘-O4 -qipa=level=2’ 매크로

      • 프로그램의 실행 성능을 높이기 위해 가장 흔히 사용하는 옵션이며, 디버깅을 위한 컴파일이 아니라면 최소한 레벨 2, 적어도 레벨 3의 최적화 레벨 옵션 사용을 권장


    2941468

    컴파일러를 이용한 최적화 (2/15)

    • -O 혹은 -O2 사용시의 최적화 내용

      • 전체적으로 사용자 변수를 레지스터에 할당

      • update와 같은 어드레싱 모드의 효과적인 사용

      • 사용되지 않거나 불필요하게 과한 코드 부분의 제거

      • 변하지 않는 코드 부분을 루프 밖으로 이동

      • 프로그램의 실행 기계에 대한 명령어 스케줄링

      • 루프 언롤링과 스케줄링

    • -O3 사용시의 최적화 내용

      • 안쪽 루프의 언롤링

      • 개선된 루프 스케줄링

      • -qnostrict 옵션을 함께 사용하면 –qstrict 옵션에 의한 제한을 무시하는 추가적인 최적화를 허용

      • 보통 전체 프로시저에 해당하는 최적화 범위의 확대

      • 암시적으로 적용되는 -qmaxmem=-1 옵션에 의해 최적화를 위해 사용하는 메모리 제한 없음


    2941468

    컴파일러를 이용한 최적화 (3/15)

    • 최적화 레벨 옵션 사용시의 팁

      • 최적화 레벨 옵션을 사용하기 전에 프로그램의 실행여부를 테스트하고 디버깅

      • 최적화를 수행하는 컴파일 옵티마이저는 표준에 대한 적합성 여부를 검사하고, 표준에 충실히 따른 프로그램의 최적화를 가장 잘 수행하므로 프로그램을 작성할 때는 표준을 따르도록 작성

        • Fortran 프로그램의 경우 서브루틴의 매개 변수들이 별칭(alias) 규칙을 따르도록

        • C 프로그램의 경우 포인터를 사용할 때의 형(type) 제한을 따르도록

        • 모든 공유변수들이 휘발성(volatile)의 특성을 가짐을 명시한다.

      • 우선, 프로그램을 구성하는 최대한 많은 코드 부분을 –O2로 컴파일

      • -O2로 문제점이 생기는 부분에 대해서는 최적화 레벨 옵션의 사용을 포기하지 말고 -qalias=noansi 혹은 -qalias=nostd 옵션을 추가로 적용


    2941468

    컴파일러를 이용한 최적화 (4/15)

    • 그 다음, -O2로 컴파일 된 부분을 포함한 최대한 많은 코드 부분을 -O3로 컴파일

    • -O3 최적화 레벨 옵션으로 문제점이 생기거나 -O2보다 성능저하가 나타난다면 해당 부분에 대해서 -O3와 함께 -qstrict 혹은 -qcompact 옵션을 추가로 적용

    • 그래도 문제점이 없어지지 않는다면, 해당 서브루틴이나 파일에 대해서만 -O2를 적용하고 -O2와 함께 -qmaxmem=-1 옵션과 -qnostrict 옵션을 사용

  • 실행 대상 시스템 옵션

    • IBM XL Fortran 및 VisualAge C/C++ 컴파일러들은 크로스컴파일러

    • 컴파일된 프로그램을 실행할 시스템의 아키텍처, 비트 모드, 공유 메모리 병렬 시스템인지의 여부 등의 특성에 따라 컴파일 옵션을 추가로 사용


  • 2941468

    컴파일러를 이용한 최적화 (5/15)

    • ARCH : Power 혹은 PowerPC 인스트럭션을 사용해서 프로그램을 생성하도록 제한. -qarch=isa 형식으로 지정하며, isa는 다음 중의 하나

      • com(디폴트) : RS/6000 계열의 시스템에서 실행 가능한 코드를 생성하며, -qtune=pwr2 옵션을 암시적으로 내포

      • auto : 컴파일하는 시스템의 아키텍처를 지정한 것과 같음

      • ppc : PowerPC 아키텍쳐의 인스트럭션을 사용하는 코드를 생성하며, 32비트 모드 컴파일 시에는 -qtune=604, 64비트 모드 컴파일 시에는 -qtune=pwr3 옵션을 암시적으로 내포

      • pwr3 : POWER3 아키텍처의 인스트럭션을 사용하는 코드를 생성하며, -qtune=pwr3 옵션을 암시적으로 내포

      • 그 외에 아키텍처에 따라 pwr, pwr2, 604, pwr4, ... 등을 지정

    • TUNE : 지정하는 시스템의 아키텍처에서 실행하기 위한 코드의 최적화를 수행. -qtune=machine 형식으로 지정되며, machine은 auto, 604, pwr2, p2sc, pwr3, pwr4, rs64c 중의 하나


    2941468

    컴파일러를 이용한 최적화 (6/15)

    • -qtune=auto는 컴파일하는 시스템의 아키텍처를 지정한 것과 같으며, 지정된 아키텍처에 대해 자동으로 조율된 코드를 생성. 특정 아키텍처를 지정하지 않으면 ARCH 옵션에 따라 –qtune의 기본 값이 지정 됨

  • CACHE : 프로그램을 실행하고자 하는 시스템의 캐쉬메모리의 설정을 지정하며, 기본 값은 TUNE 값에 따라 지정 됨. -qcache=level=n: cache_spec 형식으로 각 캐쉬 레벨별 특성치를 지정하며, cache_spec의 특성치들을 지정할 때의 지정 요소는 다음과 같음

    • type=i|d|c: 명령어 캐쉬, 데이터 캐쉬, 명령어 데이터 혼합 캐쉬와 같은 캐쉬 타입 지정

    • line=lsz:size=sz:assoc=as: 라인 크기와 캐쉬 크기 및 set associativity 지정

    • cost=c: 캐쉬 미스에 대한 CPU 사이클 단위의 비용을 지정

    • CACHE 옵션은 ARCH 및 TUNE 옵션에 의해서 지정되므로 보통 지정하지 않아도 되지만, 컴파일러 및 옵티마이저가 조건 및 옵션에 따라 프로그램을 대폭 변경할 수도 있는 -qhot 혹은 –qsmp 옵션을 사용할 때는 캐쉬의 구조를 지정하는 CACHE 옵션이 유용하게 쓰일 수 있음


  • 2941468

    컴파일러를 이용한 최적화 (7/15)

    • 64/32: 64비트 모드 혹은 32비트 모드의 어드레싱 모델을 위한 코드 생성을 지정. -q32 혹은 –q64로 지정

      • -q64는 AIX V4와 AIX V5에서 서로 다른 매직 넘버를 써서 코드를 생성하므로 코드를 양쪽에서 모두 실행할 필요가 있다면 필요에 따라 두 개의 실행 파일 혹은 라이브러리를 만들기 위해 따로 컴파일해야 함

    • SMP : 공유 메모리 병렬 시스템에서 실행할 수 있는 스레드 코드 생성을 지정하며, -qsmp[=[no]auto:[no]omp:[no]opt:fine tuning] 형식으로 지정

      • auto는 주로 루프와 같은 병렬화 가능 부분에 대해 컴파일러가 사용자의 지시어 삽입 같은 지원 없이 병렬 코드를 자동으로 생성하도록 지시

      • omp는 컴파일러에게 사용자가 명확히 병렬화를 지정하기 위해 OpenMP 1.0 언어 확장(language extension)을 사용한 부분을 관찰해서 지시어대로 병렬화 된 코드를 생성하도록 지시

      • opt는 SMP 옵션의 기본 값으로 컴파일러에게 병렬화 및 최적화를 지시하며, 최적화는 기본적으로 –O2 –qhot와 동일


    2941468

    컴파일러를 이용한 최적화 (8/15)

    • SMP 옵션 사용시의 팁

      • -qsmp 옵션을 사용하기 전에 최적화 및 단일 스레드 방식에서 –qhot 옵션을 사용하여 프로그램의 컴파일 및 실행 이상 유무를 검사

      • -qsmp 옵션을 사용할 때는 항상 ‘_r’로 끝나는 스레드용 컴파일러 명령을 사용

      • 이렇게 컴파일 된 프로그램이 실행될 때는 기본적으로 시스템 내에서 모든 유효 프로세서들을 사용해서 멀티 스레딩 방식으로 실핼될 것이므로, 유효한 프로세서 수보다 적은 수의 스레드를 사용하고자 하는 것이 아니라면, PARTHDS나 OMP_NUM_THREADS와 같은 스레드 수를 지정하는 환경 변수를 사용하지 않음

      • 벤치마크 테스트와 같은 목적으로 시스템이나 노드를 전용(dedicated)해서 사용한다면 SPINS와 YIELDS 환경 변수의 값을 0으로 설정해서 스레드가 sleep-waiting 모드로 진입하는 것을 방지, 프로그램의 실행소요시간을 줄이는 효과를 볼 수 있음


    2941468

    컴파일러를 이용한 최적화 (9/15)

    • OpenMP 프로그램을 디버깅할 때는 컴파일러로부터 디버깅 정보를 보다 정확하게 얻기 위해서 최적화 옵션 없이 –qsmp=noopt 옵션을 사용

  • 기타 옵션

    • 최적화 레벨 옵션의 –O4 및 –O5 매크로 옵션에 포함된 최적화 관련 컴파일 옵션 및 기타 유용하게 사용될 수 있는 옵션들

    • HOT(High Order Transformations) 옵션 – Fortran

      • –qhot[=[no]vectoer | arraypad[=n]]으로 지정

      • 임시변수의 제거, 문(statement) 융합과 같은 F90 배열 언어 구문의 최적화된 처리, 캐쉬/TBL 미스(miss)를 줄이기 위한 메모리 위치 개선, 하드웨어 프리패칭의 최적 사용, 로드/스토어와 부동소수점 루프 연산의 균형 유지를 위해 중첩 루프를 교환하는 등의 고 수준 변형, 역수, 제곱근, 삼각함수 등의 벡터 내재함수라이브러리를 이용하기 위한 임의의 루프 변형 등을 수행


  • 10 15

    컴파일러를 이용한 최적화 (10/15)

    • IPA (Inter-Procedural Analysis) 옵션

      • 컴파일과 링크 단계에서 –qipa[=level=n | inline= | fine tuning]으로 지정

      • 실행 파일이나 공유 목적 파일 등의 전체 프로그램 단위로 프로시저 간의 상호 분석을 통해서 최적화를 수행할 수 있으며 최적화 범위를 확장시킴

      • level=0 : 프로그램 구획화와 단순한 프로시저 상호 최적화

      • level=1 : 인라이닝(inlining)과 전체적인 데이터 매핑

      • level=2 : 전체적인 별칭 분석, 특수화(specialization), 프로시저 상호 데이터 흐름 처리

      • inline= : 인라이닝의 정확한 사용자 조정

      • fine tuning : 라이브러리 코드의 행동 명시, 프로그램 구획화 조율, 파일로부터 명령어 판독

    • PDF (Profile-Directed Feedback) 옵션

      • -qpdf1과 -qpdf2로 지정

      • -qpdf1은 프로그램의 제어 흐름 데이터 수집을 위해 사용하며, -qpdf2는 수집된 데이터를 사용해서 최적화할 때 사용. 두 옵션을 다음의 세 단계에 걸쳐서 사용


    11 15

    컴파일러를 이용한 최적화 (11/15)

    • -qpdf1과 함께 컴파일 및 링크

    • 견본 데이터를 통한 프로그램 실행

    • -qpdf2와 함께 컴파일 및 링크 (XLF 7.1.1, VA C/C++ V6에서는 -qpdf2와 재링크만 필요)

  • 최적화 관련 옵션

    • COMPACT : -q[no]compact로 지정하며, 선택이 필수적일 때 실행 시간 성능을 통해 최종 코드 크기를 감소

    • INLINE : -Q[+names | -names | !]로 지정하며, 함수 이름으로 인라이닝을 통제. 컴파일 및 링크 시에 사용 가능

    • UNROLL : -q[no]unroll로 지정하며, 독립적으로 루프 언롤링을 조정. -O2와 -O3에서는 암시적으로 활성화

    • INLGLUE : -q[no]inlglue로 지정하며, 함수 포인터 및 동적으로 한정되는 함수에 대한 콜에 사용되는 ‘glue’코드에 대한 콜을 인라인. 포인터 glue는 -qtune=pwr4에서 기본적으로 인라인 됨

    • TBTABLE: 역추적(trace-back) 테이블 정보의 생성을 조정


  • 12 15

    컴파일러를 이용한 최적화 (12/15)

    • 부동 소수점 관련 옵션

      • FLOAT : -qflot=subopt 형식으로 지정하며, 부동 소수점 연산의 처리에 대한 제어를 지시

      • FLTTRAP: -qflttrap=imprecise | enable | ieee_exceptions 형식으로 지정하며, IEEE 부동 소수점 예외(exception)들을 소프트웨어적으로 단독 검사할 수 있게 함

    • Real 및 integer형 데이터의 기본 크기 지정 옵션

      • 프로그램의 소스 코드에 kind 파라미터를 써서 정의하지 않은 integer 및 real형의 변수 크기를 지정할 때는 -qrealsize 및 -qintsize 옵션을 사용하며, 보통 프로그램을 이기종 시스템 사이에 이식할 때 시스템마다 컴파일러의 기본 변수형 크기가 다르기 때문에 발생하는 문제를 컴파일러 옵션 만으로 간단히 해결해 보고자 할 때 사용

      • 예 : CRAY 시스템에서는 8바이트 real 및 integer형이 기본이므로, 프로그램을 이식할 때 real 및 integer형의 크기와 관련된 문제(보통 real 형의 경우 표현 가능한 유효자리수, integer 형의 경우 표현 가능한 정수 값의 범위로 인한 문제)가 발생한 것으로 판단될 경우 -qrealsize=8 및 -qintsize=8 옵션을 사용해서 문제점을 해결


    13 15

    컴파일러를 이용한 최적화 (13/15)

    • Real형 변수 : -qrealsize=bytes 형식으로 REAL 및 REAL형에 기반한 DOUBLE PRECISION, COMPLEX, DOUBLE COMPLEX형 변수 및 상수들의 기본 크기를 지정하며, 지정하지 않으면 4바이트가 기본. 옵션의 값으로는 4와 8을 지정

    • Integer형 변수 : -qintsize=bytes 형식으로 INTEGER, LOGICAL형 변수 및 상수들의 기본 크기를 지정하며, 지정하지 않으면 4바이트가 기본. 옵션의 값으로는 2, 4, 8을 지정할 수 있으며, 64비트 모드 컴파일 옵션인 –q64 옵션을 지정해도 기본 값에는 영향을 미치지 않음

  • 프로그램 행동 관련 옵션

    • STRICT: -q[no]strict 형식으로 지정하며, 기본 값은 -O0와 -O2에서는 -qstrict, -O3, -O4, -O5에서는 -qnostrict. nostrict는 컴파일러가 부동 소수점 연산 및 잠재적 예외 명령들의 재정리를 허용허기 때문에 비트 수준에서의 동일 결과를 내지 않을 수 있음

    • ALIAS (Fortran): -qalias=[no]std:[no]aryovrlp:others 형식으로 지정하며, 컴파일러가 특정 변수들은 중복 저장 공간을 참조하지 않는다고 가정하는 것을 허용


  • 14 15

    컴파일러를 이용한 최적화 (14/15)

    • ALIAS (C, C++): -qalias=subopt 형식으로 지정하며, 같은 이름의 Fortran 옵션과 유사하지만 포인터를 사용해서 접근하는 저장 공간의 중복에 초점을 맞춤

    • ASSERT: -qassert=[no]deps | itercnt=n 형식으로 지정하며, deps(기본)는 루프에 의한 메모리 의존성 여부를, itercnt는 루프의 반복 카운트 기대치의 기본 값을 수정

    • INTSIZE (Fortran): -qintsize=1|2|4|8 형식으로 지정하며, INTEGER 변수의 기본 크기를 지정

    • IGNERRNO (C,C++): -q[no]ignerrno 형식으로 지정하며, errno의 값의 필요 여부를 지정

  • 진단에 도움이 되는 옵션

    • LIST: -qlist로 지정하며, 컴파일러에게 목적 코드 리스트를 만들도록 지시

    • REPORT (Fortran): -qreport[=smplist] 형식으로 지정하며, 옵티마이저에게 루프 언롤링, 자동 병렬화 등의 코드의 변형을 묘사하는 주석과 함께 의사(pseudo) Fortran 코드를 포함하는 리포트를 만들도록 지시. 리포트에는 데이터 의존성 및 다른 최적화 방해물에 관한 정보도 포함


  • 15 15

    컴파일러를 이용한 최적화 (15/15)

    • INITAUTO: -qinitauto=XX 형식으로 지정하며, 모든 자동(automatic) 스택 변수들을 주어진 값으로 초기화하는 코드를 만들도록 지시

  • 추천 컴파일 옵션

    • -O3 -qarch=pwr4 -qtune=pwr4

  • 추가 최적화 옵션

    • -O4 -qarch=pwr4 -qtune=pwr4 \

      -qcache=level=1:type=i:size=64:line=128:assoc=0:cost=13 \

      -qcache=level=1:type=d:size=32:line=128:assoc=2:cost=11 \

      -qcache=level=2:type=c:size=1440:line=128:assoc=8:cost=125


  • 2941468

    튜닝을 위한 컴파일러 지시어 (1/1)

    • PREFETCH

      • PREFETCH_BY_LOAD (variable_list): issue dummy loads to cause the given variables to be prefetched into cache - useful on Power machines or to activate Power 3 hardware prefetch

      • PREFETCH_FOR_LOAD (variable_list): issue a dcbt instruction for each of the given variables.

      • PREFETCH_FOR_STORE (variable_list): issue a dcbtst instruction for each of the given variables.

    • UNROLL

      • Specified as [NO]UNROLL [(n)]

      • Used to activate/deactivate compiler unrolling for the following loop.

      • Can be used to give a specific unroll factor.


    2941468

    성능 향상을 위한 코딩 팁 (1/5)

    • Compiler-friendly programming

      • Compiler-friendly programming idioms can be as useful to performance as any of the options or directives

      • Do not excessively hand-optimize your code (e.g. unrolling, inlining) - this often confuses the compiler (and other programmers!) and makes it difficult to optimize for new machines

      • Avoid unnecessary use of globals and pointers - when using them in a loop, load them into a local before the loop and store them back after.

      • Avoid breaking your program into too many small functions. If you must use small functions, seriously consider using -qipa.

      • Use register-sized integers (long in C/C++ and INTEGER*4 or INTEGER*8 in Fortran) for scalars. For large arrays of integers, consider using 1 or 2 byte integers or bitfields in C or C++.


    2941468

    성능 향상을 위한 코딩 팁 (2/5)

    • Use the smallest floating point precision appropriate to your computation. Use 'long double', 'REAL*16' or 'COMPLEX*32' only when extremely high precision is required.

    • Obey all language aliasing rules (try to avoid -qassert=nostd in Fortran and -qalias=noansi in C/C++)

    • Use locals wherever possible for loop index variables and bounds. In C/C++, avoid taking the address of loop indices and bounds.

    • Keep array index expressions as simple as possible. Where indexing needs to be indirect, consider using the PERMUTATION directive.

    • Consider using the highly tuned MASS and ESSL libraries rather than custom implementations or generic libraries


    2941468

    성능 향상을 위한 코딩 팁 (3/5)

    • Fortran programming tips

      • Use the '[mp]xlf90[_r]' or '[mp]xlf95[_r]' driver invocations where possible to ensure portability. If this is not possible, consider using the -qnosave option.

      • When writing new code, use module variables rather than common blocks for global storage.

      • Use modules to group related subroutines and functions.

      • Use INTENT to describe usage of parameters.

      • Limit the use of ALLOCATABLE arrays and POINTER variables to situations which demand dynamic allocation.

      • Use CONTAINS only to share thread local storage.

      • Avoid the use of -qalias=nostd by obeying Fortran alias rules.

      • When using array assignment or WHERE statements, pay close attention to the generated code with -qlist or -qreport.


    2941468

    성능 향상을 위한 코딩 팁 (4/5)

    • If performance is inadequate, consider using -qhot or rewriting array language in loop form.

  • C/C++ Programming Tips

    • Use the xlc[_r] invocation rather than cc[_r] when possible.

    • Always include string.h when doing string operations and math.h when using the math library.

    • Pass large class/struct parameters by address or reference, pass everything else by value where possible.

    • Use unions and pointer type-casting only when necessary and try to follow ANSI type rules.

    • If a class or struct contains a 'double', consider putting it first in the declaration. If this is not possible, consider using -qalign=natural


  • 2941468

    성능 향상을 위한 코딩 팁 (5/5)

    • Avoid virtual functions and virtual inheritance unless required for class extensibility. These are costly in object space and function invocation performance.

    • Use 'volatile' only for truly shared variables.

    • Use 'const' for globals, parameters and functions whenever possible.

    • Do limited hand-tuning of small functions by defining them as 'inline' in a header file.


    2941468

    병렬 프로그래밍 테크닉 (1/10)

    • 공유 메모리 병렬 작업 흐름


    2941468

    병렬 프로그래밍 테크닉 (2/10)

    • SMP 관련 환경 변수

      • AIXTHREAD_SCOPE = S or P (default = P)

      • OMP_DYNAMIC = FALSE or TRUE (default = TRUE)

      • SPINLOOPTIME=n (default = 40)

      • YIELDLOOPTIME = n (default = 0)

      • MALLOCMULTIHEAP (default = not set)

      • SMP stack size (default = 4 MB/thread)

    • 커널/유저 스레드

      • 스레드 : 스케줄의 대상이 되는 단위

      • 커널 스레드

        • 커널에 의해 스케줄

        • 시스템 스케줄러가 담당

      • 유저 스레드

        • 사용자에 의해 스케줄

        • 스레드 라이브러리가 담당


    2941468

    병렬 프로그래밍 테크닉 (3/10)

    • M:1 스레드 모델


    2941468

    병렬 프로그래밍 테크닉 (4/10)

    • 1:1 스레드 모델


    2941468

    병렬 프로그래밍 테크닉 (5/10)

    • M:N 스레드 모델


    2941468

    병렬 프로그래밍 테크닉 (6/10)

    • 스레드 환경 변수

      • AIXTHREAD_MNRATIO=p:k

        • k: 커널 스레드 수

        • p: runnable pthread 수

      • AIXTHREAD_SLPRATIO=k:p

        • k: 커널 스레드 수

        • p: sleeping pthread 수

      • AIXTHREAD_MINKTHREADS=n

        • n: 최소 커널 스레드 수

    • 자동 SMP 병렬화

      • 자동 병렬화 컴파일

        • xlf90_r -c -qsmp=auto -qnohot -qreport=smplist -O3 -qarch=pwr4 -qtune=pwr4 -qfixed sub.f

      • OpenMP 컴파일

        • xlf90_r -c -qsmp=omp -O3 -qarch=pwr4 -qtune=pwr4 -qfixed sub.f


    2941468

    병렬 프로그래밍 테크닉 (7/10)

    • 루프 A

    • 루프 B


    2941468

    병렬 프로그래밍 테크닉 (8/10)

    • 루프 C

    • 환경 변수 지정

      • export AIXTHREAD_SCOPE=S

      • export SPINLOOPTIME=100000

      • export YIELDLOOPTIME=40000

      • export OMP_DYNAMIC=false

      • export MALLOCMULTIHEAP=1


    2941468

    병렬 프로그래밍 테크닉 (9/10)

    • 실행 결과 (NX=1000000)

      • 루프 A

      • 루프 B


    10 10

    병렬 프로그래밍 테크닉 (10/10)

    • 루프 C


    2941468

    제 III 장

    • 병렬 프로그래밍 관련 도구

      • 디버깅 도구

      • 성능분석 도구


    2941468

    디버깅 도구 (1/1)

    • 병렬 디버거 pdbx

      • MPI 어플리케이션의 병렬 디버거

      • dbx의 poe 어플리케이션

      • 각 프로세서 노드에서 dbx 실행

      • dbx의 명령어와 유사

      • Normal mode: pdbx

      • Attach mode: pdbx –a <poe pid>

    • pdbx 디폴트 엘리어스

      • l list, s step, n next, c cont, p print, st stop, t where, h help

      • m map, d delete, j status, x registers, q quit, th thread, mu mutex, cv condition, attr attribute


    2941468

    성능분석 도구 (1/37)

    • XLF Fortran 타이밍 서브루틴

      • rtc(), irtc(), dtime_(), etime_(), mclock(), timef() 등은 IBM의 XLF Fortran 라이브러리에 포함된 timer루틴들

    • HPM Toolkit

      • HPM(Hardware Performance Monitor) Toolkit은 물리적인 프로세서내의 하드웨어 이벤트 카운터에서 사용자가 필요한 정보를 얻을 수 있도록 하는 라이브러리와 유틸리티의 모음

      • HPM Toolkit은 hpmcount, libhpm, hpmviz 등으로 구성되어 있으며 다음과 같은 다양한 하드웨어 이벤트들을 측정할 수 있음

        • clock cycles

        • instructions completed

        • L1 load/store misses

        • L2 load/store misses

        • TLB misses


    2941468

    성능분석 도구 (2/37)

    • FPU/FXU activity

    • number of branches

    • branch mispredictions

    • loads/stores completed

    • FMAs executed

  • POWER4 프로세서에서는 POWER3 프로세서에서와 마찬가지로 하드웨어 이벤트 카운터에서 동시에 8가지의 정보를 측정할 수 있음

  • IBM에서는 사용자가 사용하기에 편리하도록 하드웨어 이벤트 카운터 정보를 8개씩 묶어 0부터 60까지 총 61개의 그룹을 제공(POWER3의 경우는 4개의 그룹 제공), 디폴트로 사용되는 그룹은 60번

  • 각 그룹에서 다루는 정보들에 대해서는 IBM AIX 시스템의 /usr/pmapi/lib/POWER4.gps에 그 내용이 있음

  • 사용자가 프로그램의 성능분석에 자주 이용하는 정보를 담은 몇 개의 그룹들


  • 2941468

    성능분석 도구 (3/37)

    • 그룹 60 : cycles, instructions, FP 연산(나누기, FMA, 로드, 저장 포함) 회수 등

    • 그룹 59 : cycles, instructions, TLB 미스, 로드, 저장, L1 미스 회수 등

    • 그룹 5 : L2, L3, 그리고 메모리로부터의 로드 회수.

    • 그룹 58 : cycles, instructions, L3로부터의 로드, 메모리부터의 로드 회수 등

    • 그룹 53 : cycles, instructions, 고정소수점 연산, FP 연산(나누기, SQRT, FMA, and FMOV or FEST 포함) 회수 등


    2941468

    성능분석 도구 (4/37)

    • hpmcount

      • hpmcount는 사용자가 작성한 프로그램의 실제 실행 시간과 하드웨어 카운터에 관련된 정보, 사용 자원 등의 전반적인 성능을 제공하는 커맨드라인 유틸리티

      • Sequential programs on AIX:

        • $hpmcount [-o <filename>] [-n] [-g <group>] <program>

      • Parallel programs (MPI) on AIX:

        • $poe hpmcount [-o <filename>] [-n] [-g <group>] <program>

          • -o <filename> : 출력화일 <filename>.<pid> 생성옵션. 병렬 프로그램에서는 프로세스마다 하나의 파일이 생성되며, 디폴트는 표준출력.

          • -n : 표준출력을 하지 않고 파일로만 출력. –o옵션과 같이 사용됨.

          • -g <group> : (POWER4 only) 0에서 60까지 그룹 지정 가능하며, 디폴트는 60.


    2941468

    성능분석 도구 (5/37)

    • hpmcount 사용 예제와 실행결과


    2941468

    성능분석 도구 (6/37)


    2941468

    성능분석 도구 (7/37)

    • 위의 실행결과에서 수집된 정보

      • Utilization rate = User time / Wall clock time

      • Load and store operations = Loads + Stores(Total LS)

        • 2002211584 + 1003408033 = 3005619617 = 3005.620 M


    2941468

    성능분석 도구 (8/37)

    • Instructions per load/store = Instructions completed / Total LS

      • 4143170873 / 3005619617 = 1.3786

    • MIPS = 0.000001 * Instructions completed / Wall clock time

      • 0.000001 * 4143170873 / 3.890695 = 1064.892

    • Instructions per cycle = Instructions completed / Cycles

      • 4143170873 / 3758316603 = 1.102

    • HW Float points instructions per Cycle = ( FPU 0 + FPU 1 ) / Cycles

      • (627844244 + 1377820044) / 3758316603 = 0.534

    • Floating point instructions + FMAs (flip) = FPU 0 instructions + FPU 1 instructions + FMAs executed – FPU Stores (POWER4)

      • 627844244 + 1377820044 + 1000002329 – 1003408033 = 2002258584 = 2002.259 M

    • Float point instructions + FMA rate = 0.000001 * flip / Wall clock time (Mflip/s)

      • 0.000001 * 2002258584 / 3.890695 = 514.627 Mflip/s


    2941468

    성능분석 도구 (9/37)

    • FMA percentage = 100 * FMAs executed * 2 / flip

      • 100 * 1000002329 * 2 / 2002258584 = 99.887 %

    • Computation intensity = flip / Total LS

      • 2002258584 / 3005619617 = 0.666

    • 특히, 주의 깊게 봐야 할 값은 코드에 의해 수행된 부동소수점 연산의 효율을 나타내는 Mflip/s(Millions of FLoat Instructions Per Second)

    • 이 값은 초당 수행된 부동 소수점 연산의 회수를 나타내며 Mflops와 동일한 정보를 제공함


    10 37

    성능분석 도구 (10/37)

    • Xprofiler

      • PE 제품군에 속한 병렬 프로파일링 도구

      • 프로그램을 컴파일할 때 –pg옵션을 주고 컴파일하여 실행을 하면 xprofiler를 이용하여 프로그램의 어떤 서브루틴에서 시간이 얼마나 걸렸으며, 각 서브루틴들에서 걸린 시간이 전체 계산시간에서 어떻게 분포가 되는지 등에 대한 여러가지 정보들을 그래픽 환경에서 확인해 볼 수 있음

      • 실행파일이 md_small.x이고 실행시킨 후 생성된 파일이 gmon.out이라고 할 때 다음과 같이 실행하면 된다.

        $ xprofiler md_small.x gmon.out


    11 37

    성능분석 도구 (11/37)

    • Xprofiler GUI 창

      • 여기서 library에 해당되는 부분을 숨기려면 메뉴에서 Filter -> Hide All Library Calls를 클릭


    12 37

    성능분석 도구 (12/37)

    • 클러스터 노드 메뉴 : 녹색의 사각 박스의 회색부분에 오른쪽 마우스를 클릭


    13 37

    성능분석 도구 (13/37)

    • Remove Cluster Box를 클릭하면 md_small.x에 해당되는 부분이 확대 됨


    14 37

    성능분석 도구 (14/37)

    • 찾고자 하는 부분 확대 : 메뉴에서 View -> Overview 를 클릭 Overview Window를 띄운 다음 파란색의 사각형을 작게 축소하면 그 부분에 해당되는 부분을 전체 화면에서 확대해 볼 수 있음


    15 37

    성능분석 도구 (15/37)

    • 각 창의 그림에서 크고 작은 크기의 녹색 사각형이 나타나는데 이 녹색 사각형 바로 밑에 A x B 형태로 계산 시간이 적혀 있고, 다시 그 밑에 서브루틴의 이름이 적혀 있음

    • A x B 형태로 적힌 계산 시간에서 B에 해당하는 시간은 순수하게 그 서브루틴에서 걸린 시간을 나타내고, A에 해당하는 시간은 하위 서브루틴에서 걸린 시간과 B에 해당하는 시간을 합친 그 루틴의 전체 계산시간을 나타냄

    • 또한, 녹색 사각형에서 가로의 길이는 위의 A에 해당하는 시간을 나타내고 세로의 길이는 위의 B에 해당하는 시간을 나타냄

    • 순차코드를 병렬화 할 때 위와 같이 프로파일링을 한 후 녹색으로 표시된 사각형의 면적이 넓은 곳을 찾아서 효율적으로 병렬화를 할 수 있음


    16 37

    성능분석 도구 (16/37)

    • Report 메뉴를 통해 다양한 프로파일링 정보를 확인해 볼수 있으며, 특히 Report -> Flat profile를 이용하여 플랫 프로파일링 정보를 확인할 수 있음


    17 37

    성능분석 도구 (17/37)

    • Flat profile 창의 Code Display -> Show Source Code 메뉴를 통해 선택한 서브루틴의 소스코드를 확인해 볼 수 있음


    18 37

    성능분석 도구 (18/37)

    • MPI trace 라이브러리

      • /usr/lib 밑에 libmpitrace.a 라이브러리 형태로 존재

      • MPI의 메시지 패싱과 관련된 메시지 패싱 프로파일링 정보 제공

      • MPI 병렬 프로그램을 컴파일할 때 라이브러리 링크 옵션 -lmpitrace 추가

        $ mpxlf -O3 -qstrict -lmpitrace -o pi pi.f

      • 컴파일 후 MPI 프로그램을 실행하면 MPI 작업의 테스크 수 만큼 mpi_profile.* MPI 프로파일 파일 생성

        • 만약 테스크 수를 6개로 하면 mpi_profile.0 ~ mpi_profile.5의 6개 MPI 프로파일 파일 생성

        • 각각의 파일에는 MPI 작업의 각 task, 즉 프로그램이 실행되면서 부여되는 각 테스크에 해당하는 정보 포함

        • 예를 들어, mpi_profile.0 파일에는 rank=0인 테스크의 정보가 포함되어 있고, mpi_profile.5파일에는 rank=5인 프로세스의 정보가 포함되어 있음


    19 37

    성능분석 도구 (19/37)

    • mpi_profile.* 파일에 포함된 정보


    20 37

    성능분석 도구 (20/37)

    • PE Benchmarker

      • PE Benchmarker는 IBM AIX Parallel Environment 환경에서 구동 되는 프로그램들의 성능을 분석할 수 있는 응용프로그램과 도구들로 구성된 툴셋이며, 크게 다음 세가지로 이루어져 있음

      • PCT(Performance Collection Tool) : 하나 혹은 그 이상의 응용프로그램 프로세스로부터 MPI 이벤트 트레이스 데이터 혹은 하드웨어/운영체제 성능 데이터를 수집. 커맨드라인 인터페이스 모드와 그래픽 사용자 인터페이스(GUI) 모드로 실행 가능.

      • UTE(Unified Trace Environment) 도구 모음 : PCT를 이용해 수집된 MPI 이벤트 트레이스 정보를 저장해둔 AIX 트레이스 파일들을 UTE interval 파일로 변환시키고, 변환된 파일로부터 성능분석 테이블을 생성. 다음과 같은 UTE 도구들이 있으며 커맨드라인 인터페이스 모드로 실행

        • uteconvert : AIX 이벤트 트레이스 파일을 UTE interval 파일로 변환

        • utemerge : 여러 개의 UTE interval 파일을 하나의 interval 파일로 합침


    21 37

    성능분석 도구 (21/37)

    • utestats : UTE interval 파일로부터 얻은 정보에 대한 통계 테이블을 생성

    • slogmerge : Argonne 국립 연구소의 MPI 프로그램 성능분석 도구인 Jumpshot을 이용할 수 있도록 UTE interval 파일들을 SLOG(Scalable logfile) 파일 포맷으로 변환시키고 합침

  • PVT(Performance Visualization Tool) : PCT를 이용해 하드웨어/운영체제 성능 데이터를 수집하면, 각 프로세스별로 수집된 프로파일 정보는 netCDF(network Common Data Form) 파일로 저장. PVT는 netCDF 파일로부터 프로파일 정보를 읽고 요약해 사용자에게 보여줌. 커맨드라인 모드와 GUI 모드로 실행 가능.

  • PE Benchmarker 툴셋을 이용한 프로그램의 성능분석은 PCT와 PVT를 이용한 하드웨어/운영체제 성능분석과 PCT와 UTE 혹은 PCT와 UTE 그리고, Jumpshot을 이용한 MPI 프로그램 성능분석으로 나누어 볼 수 있음


  • 22 37

    성능분석 도구 (22/37)

    • PCT/UTE 사용


    23 37

    성능분석 도구 (23/37)

    • PCT/PVT 사용


    24 37

    성능분석 도구 (24/37)

    • PCT : X윈도 GUI/명령어 방식


    25 37

    성능분석 도구 (25/37)

    • PVT : X윈도 GUI/명령어 방식


    26 37

    성능분석 도구 (26/37)

    • MPI 프로그램 프로파일을 위한 PCT 사용

      • PCT는 커맨드라인 인터페이스와 GUI를 모두 지원

      • Jumpshot을 이용한 MPI 프로그램 성능분석을 위하여, 분석에 사용될 MPI 트레이스 파일을 PCT를 이용하여 생성

      • 이를 위해 성능분석이 필요한 프로그램을 컴파일하기 전에 먼저 필요한 라이브러리를 링크하기 위해

        • 환경변수 MP_UTE를 yes로 설정

        • 이렇게 설정된 MP_UTE 환경변수를 통해 UTE 라이브러리를 추가할 수 있도록 하기위해서는 컴파일 스크립트를 반드시 “_r” 버전을 사용

      • 환경변수 설정

        $ export MP_UTE=yes

      • 프로그램 컴파일

        • 성능분석을 위한 MPI 프로그램을 스레드 사용 가능한(thread-enabled) 컴파일 스크립트(_r)를 이용하여 컴파일

          $ mpxlf_r –o pipelined pipelined.f


    27 37

    성능분석 도구 (27/37)

    • PCT 실행

      • 사용자의 시스템에서 PCT를 GUI로 사용하기 위해서는 적절한 X윈도우 환경이 우선적으로 설정되어 있어야 함

        $ pct

      • Load a new application 선택, OK 클릭(Load Application 윈도우 열림)


    28 37

    Load Application 윈도우에서 SPMD parallel을 선택하고 Executable name 필드에서 Browse 버튼을 이용하여 성능분석이 필요한 프로그램을 선택

    POE Arguments 필드에 적절한 POE 실행 옵션 기입. 예를 들면, 병렬실행에 참여하는 프로세스 개수(–procs n) 등을 기입

    Load 버튼을 클릭하여 프로그램을 로드(Probe Data Selection 윈도우 열림)

    성능분석 도구 (28/37)


    29 37

    성능분석 도구 (29/37)

    • 수집을 원하는 데이터의 타입을 선택하는데 지금과 같이 MPI 프로그램 성능분석을 위해서는 MPI and user event traces를 선택해야 하지만 만약 하드웨어/운영체제 성능 데이터를 원한다면 Hardware and operating system profiles를 선택해야 함

    • 출력파일이 생성될 디렉터리와 기본파일명을 적어주고 OK를 클릭(메인 윈도우가 열림)


    30 37

    성능분석 도구 (30/37)

    • 메인 윈도우 Process  Select All Connected, Source Tree에서 pipelined.f 선택

    • Probe Selection 영역에서 All MPI Events를 선택

    • Add 버튼을 클릭해 필요한 정보 수집을 위한 탐침(probe)을 설치

    • 메뉴 바에서 Application  Start를 선택해 프로그램을 실행

    • 프로그램의 실행 완료후 PCT 종료


    31 37

    성능분석 도구 (31/37)

    • 위와 같은 과정을 거쳐 성공적으로 메시지 패싱에 대한 데이터를 수집했다면 AIX 트레이스 파일이 생성

    • 이 트레이스 파일은 각 노드마다 하나씩 생성되는데, 위의 예에서 사용한 네 개의 프로세스 모두를 하나의 노드에서 실행되도록 했다면 트레이스 파일은 mytrace.#의 형식으로 하나가 생성

    • 여기서 #은 프로세스가 네 개이므로 0부터 3까지의 값 중 임의의 값을 하나 가지게 됨

  • uteconvert 실행

    • 생성된 AIX 트레이스 파일을 uteconvert를 이용하여 UTE interval 파일로 변환

    • 기본적으로 트레이스 파일의 이름을 그대로 가져와 mytrace.ute.# 파일이 생성되지만 –o 옵션을 이용하여 원하는 이름을 지정해 줄 수 있음

      $ uteconvert mytrace.1

      $ uteconvert –o tracefile.ute mytrace.1


  • 32 37

    성능분석 도구 (32/37)

    • slogmerge 실행

      • 수집한 정보를 Jumpshot에서 볼 수 있도록 slogmerge를 이용해 UTE interval 파일을 SLOG 파일로 변환

      • 기본적으로 (UTE 파일 이름).slog 파일이 생성되지만 역시 –o 옵션을 이용하면 원하는 이름을 지정해 줄 수 있음

        $ slogmerge mytrace.ute.1

        $ slogmerge –o tracefile.slog tracefile.ute


    33 37

    성능분석 도구 (33/37)

    • Jumpshot

      • Jumpshot은 PE Benchmarker 툴셋에 포함된 프로그램이 아니며 이는 미국 Argonne 국립 연구소에서 개발한 공개 MPI 구현 패키지인 MPICH/MPE에 포함된 자바기반의 성능분석 가시화 툴

      • KISTI IBM 시스템의 /applic/bin 디렉토리에 jumbshot이라는 이름으로 설치되어 있으며 인터넷에서 받아 개별적으로 설치해 사용할 수도 있음

      • GUI 기반의 Jumpshot도 PCT와 마찬가지로 실행하기 전에 적절한 X윈도우 설정이 필요


    34 37

    성능분석 도구 (34/37)

    • Jumpshot 실행

      $ /applic/bin/jumpshot

      • 메뉴 바에서 File  Select Logfile을 이용해 만들어둔 SLOG 파일을 로드( View and Frame Selector 윈도우가 열림)

      • View and Frame Selector 윈도우에는 Event Count vs. Time의 그래프가 나타남

      • 프로그램의 진행시간에 따른 적절한 프레임을 선택하고 View Options에서 MPI-Process를 선택한 후 Display 버튼을 클릭하면 Time line 윈도우를 볼 수 있음


    35 37

    성능분석 도구 (35/37)

    • View & Frame Selector 윈도우


    36 37

    성능분석 도구 (36/37)

    • Time Lines 윈도우


    37 37

    성능분석 도구 (37/37)

    • Time Line 윈도우의 X축은 프로그램의 진행시간을 Y축은 프로세스 랭크를 표시

    • MPI 서브루틴은 하나의 box로 표현되고 함수 내부 혹은 함수 사이의 통신은 화살표로 표시

    • 상단의 Zoom Operations에서 In/Out 버튼을 이용하여 선택한 프레임의 MPI 이벤트 발생을 좀더 자세히 살펴볼 수 있음

    • 사용자는 Time Line 윈도우의 MPI 프로그램 진행상황과 통신특성 등을 살펴보고 자신의 프로그램에 대한 성능분석을 한 후 적절한 최적화 방안을 마련할 수 있음


    2941468

    제 IV 장

    • 참고 자료 및 부록

      • 참고 자료


    2941468

    참고 자료 (1/1)

    • IBM Redbook (http://www.redbooks.ibm.com)

      • The POWER4 Processor Introduction and Tuning Guide

    • IBM Software Publications

      • IBM Parallel Environment for AIX: Hitchhiker's Guide

    • HPC 기술서 (http://www.supercomputing.re.kr)

      • IBM 기술서 1권 (2002년 9월)

      • IBM 기술서 3권 (2003년 3월)

      • IBM 기술서 4권 (2003년 5월)


  • Login