Transcript Document

고급 병렬
프로그래밍
목 표
KISTI가 현재 보유하고 있는 IBM 시스템에서 순차 및
병렬 프로그램의 성능을 최적화 시키기 위해 필요한 배
경 지식을 습득하고 최적화와 관련해서 사용할 수 있는
도구의 사용법을 익히도록 한다.
차 례
I. 고급 병렬 프로그래밍 개요
4
II. IBM 시스템에서 성능 최적화
III. 병렬 프로그래밍 관련 도구
IV. 참고 자료 및 부록
31
106
145
제I장
고급 병렬 프로그래밍 개요
 병렬 프로그램의 성능최적화
 일반적인 프로그램의 튜닝
가이드라인
 하이브리드 병렬 프로그래밍
병렬 프로그램의 성능최적화 (1/5)
 성능향상도(speed-up) S(n)
S(n)=
순차 프로그램의 실행시간
병렬 프로그램의 실행시간(n개 프로세서)
ts
= t
p
 순차 프로그램에 대한 병렬 프로그램의 성능향상 정도
 실행시간(elapsed time)은 벽시계시간(wall clock time) 기준
 실행시간이 24시간 소요되는 순차 프로그램을 병렬화, 4개 프로세서를
사용해서 8시간 만에 결과를 얻을 수 있게 된 경우의 성능향상도
S(4)=
24
8
=3
Supercomputing Center
5
병렬 프로그램의 성능최적화 (2/5)
 Amdahl’s Law
 ‘병렬프로그램의 성능향상도는 순차 프로그램에서 병렬화 가능한 부분
의 비율에 의해서 결정된다.’
 이상(ideal) 성능향상도 Sideal
tp = fts + (1-f)ts/n
여기서, f는 병렬화 불가능한 부분이며 0 ≤ f ≤ 1
ts
ts
1
=
=
S(n)=
tp
fts + (1-f)ts/n
f + (1-f)/n
만일, 프로세서를 충분히 많이(n  ∞) 사용한다면,
Sideal =
1
f
Supercomputing Center
6
병렬 프로그램의 성능최적화 (3/5)
 이론 성능향상도
 f = 0.2, n = 4
Serial
Parallel
process 1
20
20
80
20
process 2
process 3
cannot be parallelized
process 4
can be parallelized
S(4)=
1
0.2 + (1-0.2) / 4
= 2.5
Supercomputing Center
7
병렬 프로그램의 성능최적화 (4/5)
 실제 성능향상도
 실제의 경우 통신부하, 부하분산 불균형이 성능향상도에 영향을 미침
20
80
Serial
parallel
20
20
process 1
cannot be parallelized
process 2
can be parallelized
process 3
communication overhead
process 4
Load unbalance
Supercomputing Center
8
병렬 프로그램의 성능최적화 (5/5)
 병렬 프로그램의 효율(efficiency) E(n)
E(n)=
ts
tp x n
=
S(n)
n [ x 100 (%) ]
 프로세서 사용 개수에 따른 병렬 프로그램의 성능 효율
 4개의 프로세서로 3배의 성능향상이 있는 경우 0.75 혹은 75%의 병렬
프로그래밍 효율
 병렬 프로그램의 성능 향상을 위한 가이드라인
 순차 프로그램에서 병렬화 될 수 있는 부분을 증가시킴
 병렬 프로세스들의 부하분산을 고르게 함
 통신에 소요되는 시간을 최소화 시킴
Supercomputing Center
9
일반적인 튜닝 가이드라인 (1/14)
 코드의 핸드 튜닝
 지역변수와 전역변수


전역변수는 변수의 범위(scope) 특성 때문에 컴파일러의 최적화 방해
최대한 자동변수(automatic variable)과 같은 지역변수를 많이 사용
 포인터

최적화 과정에서 포인터를 쫓는 것은 어렵거나 불가능하기 때문에 대부분
의 메모리 관련 최적화를 방해
 수식의 표현

Fortran 컴파일러는 동일 수식은 잘 인지하지만, 교환법칙을 이해하지는
못함
x=a+b+c+d
y=a+c+b+d

가능하면, 동일한 수식을 표현할 때의 변수들은 동일 순서로 배열
Supercomputing Center
10
일반적인 튜닝 가이드라인 (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 같은 최적화 불가능한 데이터 형을 피할 것
Supercomputing Center
11
일반적인 튜닝 가이드라인 (3/14)
 성능에 치명적인 루프에서 피해야 할 것들



큰 스트라이드의 데이터 접근
적은 수의 반복계산을 수행하는 루프
I/O 문의 포함
 루프 튜닝의 예





IF 문의 제거
경계조건 IF 테스트
반복적인 내재(intrinsic) 함수의 계산
나눗셈을 역수의 곱셈으로 치환
2의 승수의 배수를 갖는 배열 문제
Supercomputing Center
12
일반적인 튜닝 가이드라인 (4/14)

IF 문의 제거
튜닝 전
튜닝 후
DO I=1,N
IF(D(J).LE.0.0)THEN
IF(D(J).LE.0.0)X(I)=0.0
DO I=1,N
A(I)=B(I)+C(I)*D(I)
A(I)=B(I)+C(I)*D(I)
E(I)=X(I)+F*G(I)
X(I)=0.0
ENDDO
E(I)=F*G(I)
ENDDO
ELSE
DO I=1,N
A(I)=B(I)+C(I)*D(I)
E(I)=X(I)+F*G(I)
ENDDO
ENDIF
Supercomputing Center
13
일반적인 튜닝 가이드라인 (5/14)

경계조건 IF 테스트
튜닝 전
튜닝 후
DO I=1,N
A(1)=B(1)+C(1)*D(1)
IF(I.EQ.1)THEN
X(I)=0.0
ELSEIF(I.EQ.N)THEN
X(I)=1.0
ENDIF
X(1)=0.0
E(1)=F*G(1)
DO I=2,N-1
A(I)=B(I)+C(I)*D(I)
E(I)=X(I)+F*G(I)
A(I)=B(I)+C(I)*D(I)
ENDDO
E(I)=X(I)+F*G(I)
X(N)=1.0
ENDDO
A(N)=B(N)+C(N)*D(N)
E(N)=1.0+F*G(N)
Supercomputing Center
14
일반적인 튜닝 가이드라인 (6/14)

반복적인 내재(intrinsic) 함수의 계산
튜닝 전
튜닝 후
DO I=1,N
DIMENSION SINX(N)
DO J=1,N
A(J,I)=B(J,I)*SIN(X(J))
ENDDO
ENDDO
…
DO J=1,N
SINX(J)=SIN(X(J))
ENDDO
DO I=1,N
DO J=1,N
A(J,I)=B(J,I)*SINX(J)
ENDDO
ENDDO
Supercomputing Center
15
일반적인 튜닝 가이드라인 (7/14)

나눗셈을 역수의 곱셈으로 치환
튜닝 전
튜닝 후
DO I=1,N
DO I=1,N
A(I)=B(I)/C(I)
OC=1.0/C(I)
P(I)=Q(I)/C(I)
A(I)=B(I)*OC
ENDDO
P(I)=Q(I)*OC
ENDDO
DO I=1,N
DO I=1,N
A(I)=B(I)/C(I)
OCD=1.0/( C(I)*D(I) )
P(I)=Q(I)/D(I)
A(I)=B(I)*D(I)*OCD
ENDDO
P(I)=Q(I)*C(I)*OCD
ENDDO
Supercomputing Center
16
일반적인 튜닝 가이드라인 (8/14)

2의 승수의 배수를 갖는 배열 문제
튜닝 전
튜닝 후
integer nx,nz
integer nx,nz
parameter (nx=2048,nz=2048)
parameter (nx=2048,nz=2048)
real p(2,nx,nz)
real p(2,2080,nz)
...
...
do ix=2,nx-1
do ix=2,nx-1
do iz=2,nz-1
p(it1,ix,iz)= -p(it1,ix
end do
end do
do iz=2,nz-1
, iz) \
p(it1,ix,iz)= -p(it1,ix
, iz) \
+s*p(it2,ix-1 ,iz) \
+s*p(it2,ix-1 ,iz) \
+s*p(it2,ix+1,iz) \
+s*p(it2,ix+1,iz) \
+s*p(it2,ix
, iz-1) \
+s*p(it2,ix
, iz-1) \
+s*p(it2,ix
, iz+1)
+s*p(it2,ix
, iz+1)
end do
end do
Supercomputing Center
17
일반적인 튜닝 가이드라인 (9/14)
 튜닝된 코드의 사용
 이미 튜닝된 작업에 시간을 허비하지 말 것
 배열연산, 선형 대수 방정식의 풀이, BLAS 함수, FFT, convolution 등
과 같은 표준 함수들을 코드에서 사용한다면 대응되는 ESSL 함수를 사
용하도록 코드를 수정
 성능 모니터링
 POWER3, POWER4 프로세서는 하드웨어 성능 모니터링 장치 포함
 프로세서의 동작이나 명령의 처리와 관련된 자세한 정보를 담은 카운터
에 대한 접근을 OS 차원에서 제공
 Performance Monitor API 패키지
$ lslpp –l bos.pmapi.*
 Performance Monitor API와 HPM Toolkit을 이용해서 프로그램의 성
능 모니터링에 필요한 관련 카운터의 정보를 얻을 수 있음
Supercomputing Center
18
일반적인 튜닝 가이드라인 (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
program pm_test
integer pminit,pmstart,pmstop,
pmprint,i,j
integer result,group
do i=1,512
do j=1,512
a(i,j) = a(i,j) *1.5
end do
real*8 x,a(512,512)
end do
group=5
result = pmstop()
result = pminit(%VAL(group))
result = pmprint()
result = pmstart()
end program
Supercomputing Center
19
일반적인 튜닝 가이드라인 (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 데이터를 전송
Supercomputing Center
20
일반적인 튜닝 가이드라인 (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가 효율적
Supercomputing Center
21
일반적인 튜닝 가이드라인 (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 시간이 어떻게 사용되었는지
를 알려 줌
프로그램을 가장 효과적으로 튜닝할 수 있는 서브루틴이나 루프를 밝혀 줌
Supercomputing Center
22
일반적인 튜닝 가이드라인 (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의 기능을 포함한 X GUI 프로파일러
Supercomputing Center
23
하이브리드 병렬 프로그래밍 (1/7)
 동기와 필요성
 성능 향상을 위해서




노드 내에서의 MPI 사용으로 인한 통신의 초기 지연 방지
다중 프로세스 실행으로 인해 발새하는 노드 내에서의 불필요한 데이터 복
사 방지
노드간의 MPI 콜로 인한 통신 지연 감소
전체적인 메시지 패싱 작업 감소
 메모리 사용을 줄이기 위해서

다중 프로세스 실행으로 인해 노드 내에서 중복되는 데이터 복제 방지
Supercomputing Center
24
하이브리드 병렬 프로그래밍 (2/7)
 하이브리드 병렬 프로그래밍 과정
Supercomputing Center
25
하이브리드 병렬 프로그래밍 (3/7)
 병렬화 접근 방식의 형태
 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
Supercomputing Center
26
하이브리드 병렬 프로그래밍 (4/7)
 병렬화 접근 방식에 따른 특성
 Fine Grained


적용하기 용이
OpenMP 지시어를 사용하게 되고, 그에 따라 fork-join 되기 때문에 스레드
생성 및 동기화 인해 발생하는 부하가 성능 저조에 영향
 Coarse Grained


상대적으로 복잡하므로 적용하는데 많은 시간이 소요 됨
스레드 생성으로 인한 부하가 적음
Supercomputing Center
27
하이브리드 병렬 프로그래밍 (5/7)
 Fine Grained 접근 방식
Supercomputing Center
28
하이브리드 병렬 프로그래밍 (6/7)
 Coarse Grained 접근 방식
 MPI 코드에서 시작
 각 MPI 테스크가 시작 부분에서 스레드들을 한번 생성
 초기화 같은 순차 작업이나 MPI 콜들은 MASTER 혹은 SINGLE 지역
에서 수행
 메인 배열은 전역변수
 작업 분배 : 각 스레드는 그 스레드 번호(omp_get_thread_num())에
따라 배열 데이터의 조각을 담당. 1차원 블록 분배.
 OMP DO를 사용치 않음
 변수 및 함수의 유효 범위(scope)와 동기화(synchronization)에 주의
Supercomputing Center
29
하이브리드 병렬 프로그래밍 (7/7)
 적용 경우





MPI로 확장성이 우수하지 않는 경우
동적 부하 분산(dynamic load balancing)을 이용할 수 있는 경우
Fine-grained 병렬성을 갖고 있는 경우
중복된 데이터를 갖고 있는 경우
노드 내 통신에 적합한 MPI가 없는 경우
 현실적 제약
 성능 향상이 크지 않거나 저하
 프로그래밍이 어려움
Supercomputing Center
30
제 II 장
IBM 시스템에서 성능 최적화
 POWER4 프로세서를 사용하는 KISTI
IBM 시스템에서의 최적화 방법
 POWER4 시스템을 위한 튜닝, 컴파일러
를 이용한 최적화, 병렬 프로그래밍 테크닉
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, 16way SMP, Copper/SOI기술, ASCI White, 서울대
Supercomputing Center
32
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 (모듈)
Supercomputing Center
33
POWER4 시스템 (3/11)
 POWER4 프로세서 칩
Supercomputing Center
34
POWER4 시스템 (4/11)
 POWER4 프로세서 코어
Supercomputing Center
35
POWER4 시스템 (5/11)
 POWER4 프로세서 실행 파이프라인
Supercomputing Center
36
POWER4 시스템 (6/11)
 POWER4 메모리 체계의 구조와 용량
구 성 요 소
L1 명령어 캐시
L1 데이터 캐시
구 조
직접 매핑, 128바이트 라인
2웨이, 128바이트 라인
L2 캐시
4웨이 ~ 8웨이, 128바이트 라인
L3 캐시
8웨이, 512바이트 라인, 128바이트
4개 섹터로 관리
용 량
128KB/칩
(64KB/프로세서)
64KB/칩
(32KB/프로세서)
1440KB/칩
(1.41MB)
128MB/MCM
Supercomputing Center
37
POWER4 시스템 (7/11)
 MCM과 POWER4 메모리 체계의 연결
Supercomputing Center
38
POWER4 시스템 (8/11)
 MCM과 MCM 사이의 연결
Supercomputing Center
39
POWER4 시스템 (9/11)
 메모리 체계와 MCM들 사이의 연결
Supercomputing Center
40
POWER4 시스템 (10/11)
 하드웨어 데이터 프리패치(prefetch)
 캐시 미스(miss)의 영향
 각 메모리 구성 요소로부터 1워드(word) 로드(load) 소요 시간
L1 : 1 CPU 사이클,
L3 : ~100 CPU 사이클,
L2 : ~12 CPU 사이클
메모리 : ~300 CPU 사이클(latency 포함)
Supercomputing Center
41
POWER4 시스템 (11/11)
 POWER4 시스템 I/O 구조
Supercomputing Center
42
수치 어플리케이션을 위한 튜닝 (1/2)
 수치 어플리케이션을 위한 튜닝 과정
 I/O가 프로그램의 중요 부분이라면 이 부분을 따로 튜닝하는 것이 중요
하며 계산 부분의 튜닝과는 별개의 과정임
 최고의 컴파일러 최적화 옵션을 사용
 프로파일링을 통해서 프로그램에서의 핫스팟 찾기

이 과정은 매우 중요하며, 프로그램에서 자주 실행되지 않는 부분을 튜닝하
는데 시간을 허비하지 말 것
 가능하면 MASS 라이브러리나 ESSL 혹은 다른 성능에 최적화된 라이
브러리를 사용
 일반적으로 사용하는 프로그램의 작성과 관련된 튜닝 가이드라인을 따
라서 프로그램을 튜닝
 POWER4 시스템에 적합하도록 핸드 튜닝
Supercomputing Center
43
수치 어플리케이션을 위한 튜닝 (2/2)
 수치 어플리케이션의 핸드 튜닝
 부정적 요인을 피하기





수치 연산 장치보다 느린 메모리 시스템의 부정적 효과를 피하거나 최소화
시키기 위한 방편
스트라이드 최소화
데이터 프리패칭의 흐름이 잘 이루어지도록 튜닝
캐시의 세트 조합성(set associativity) 구속을 회피
데이터 캐시 블로킹(blocking)
 긍정적 요인을 이용



특히, 부동소수점 연산장치와 같은 수치 연산 장치의 활용 효율을 극대화
시키기 위한 방편
안쪽 루프의 언롤링(unrolling) : 루프의 반복 당 독립 연산의 수를 증가시
켜 파이프라인을 채움
바깥쪽 루프의 언롤링 : 로드(load), 스토어(store)에 대한 연산 명령어의
비율을 증가시켜 루프의 성능이 데이터의 이동보다 연산에 의존토록 조정
Supercomputing Center
44
캐시 메모리를 위한 튜닝 (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 레벨에서 시스템 전체에 걸쳐 유지
Supercomputing Center
45
캐시 메모리를 위한 튜닝 (2/17)
 일반적인 캐시 고려 사항
 L2 캐시에서 L1 캐시로의 대역폭(bandwidth)은 부동소수점 연산장치
에 데이터를 원활히 공급해 주기에 충분
 성능관점에서 L1 캐시와 L2 캐시의 가장 큰 차이점은 지연(latency)
 L1 캐시와 부동소수점 레지스터(register) 사이의 지연 : ~4 cycles
 L2 캐시와 부동소수점 레지스터 사이의 지연 : ~14 cycles
 조밀(dense) 행렬 연산에 대한 추천


L2 캐시에 대한 데이터 블로킹
L1 캐시에 대한 데이터 접근 조직화
 L1 데이터 캐시의 구조
 캐시 라인(cache line)


개념상 메모리 혹은 캐시를 128바이트 단위의 연속으로 나눈 것
메모리와 캐시 사이에서의 데이터 전송 단위
Supercomputing Center
46
캐시 메모리를 위한 튜닝 (3/17)
 세트 조합성(set associativity)


2웨이 세트 조합성을 갖는 128개의 합동(congruence) 클래스 구조
2 x 128 x 128바이트 = 32KB
Supercomputing Center
47
캐시 메모리를 위한 튜닝 (4/17)
 POWER4 프로세서의 L1 데이터 캐시의 세트 조합성 관련 특성
 합동(congruence) 클래스 : L1 데이터 캐시 구조 그림에서의 동일 칼
럼을 이루는 캐시 라인들의 집합
 2웨이 세트 조합성, 128 합동 클래스
 메모리와 캐시 사이의 로드/스토어는 같은 합동 클래스 상의 캐시 라인
들 사이에서만 허용
 메모리 상의 128바이트 크기 메모리 라인은 2곳의 캐시 라인 중 한 곳으
로만 로드 가능
 실질적으로 유효한 L1 데이터 캐시의 크기를 감소시키는 효과
 16KB의 배수로 메모리 요소를 접근할 경우 POWER4 프로세서 L1 데
이터 캐시 활용 면에서 최악의 상황 초래
Supercomputing Center
48
캐시 메모리를 위한 튜닝 (5/17)
 스트라이드 최소화
 스트라이드 값이 1 혹은 작음으로 인한 데이터의 순차 접근은 캐시의
활용 및 하드웨어 프리패칭 흐름 관점에서 이득
 데이터가 캐시 라인에 로드되면 16개의 배정도(double precision) 워
드(word) 혹은 32개의 단정도(single precision) 워드가 한 개의 캐시
라인을 차지, 데이터 접근 단위를 나타내는 스트라이드 값이 배정도의
경우 16, 단정도의 경우 32인 경우 한 개의 캐시 라인에서 한 개의 워드
만을 접근해서 사용하게 되고, 추후 동일 캐시라인 내의 데이터를 접근
하려 할 때 캐시 미스(miss) 발생 확률 높음
 데이터에 대한 스트라이드 1 혹은 –1의 순차접근만이 8개의 하드웨어
프리패칭 흐름 중 하나를 가동할 수 있음
 Fortran의 경우 열 우선 순서 접근, C의 경우 행 우선 순서 접근이 유리
함
Supercomputing Center
49
캐시 메모리를 위한 튜닝 (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];
}
Supercomputing Center
50
캐시 메모리를 위한 튜닝 (7/17)
 보통의 경우 : 루프 내의 모든 배열을 스트라이드 1로만 접근하는 것은
어려우며 이런 경우 데이터 캐시 블로킹 방법의 적용이 필요함
DO I = 1, N
DO J = 1, N
DO K = 1, N
D(I,J) = D(I,J) + A(J,K)*B(K,I)
ENDDO
ENDDO
ENDDO
Supercomputing Center
51
캐시 메모리를 위한 튜닝 (8/17)
 데이터 프리패칭 흐름 튜닝
 POWER4 프로세서에서는 데이터 프리패칭이 하드웨어를 이용해서 이
루어짐
 데이터 프리패칭 장치를 효과적으로 활용하기 위한 튜닝


프로그램의 성능에 많은 영향을 주는 루프에서 너무 많거나 적은 수의 프리
패칭 흐름을 적절한 수로 조절
프로그램의 성능에 많은 영향을 주는 루프에서 프리패칭 흐름의 길이(루프
의 반복회수)를 너무 짧지 않게 조절
 루프내의 프리패칭 흐름의 수 조절 방법



루프 내에 4개 ~ 8개의 하드웨어 프리패칭 흐름에 최적화 되어 있음
인접 루프들의 융합(fusing) : -qhot 컴파일러 옵션으로 가능
루프의 중간지점 양분(midpoint bisection)
Supercomputing Center
52
캐시 메모리를 위한 튜닝 (9/17)
 데이터 프리패칭 흐름 튜닝 예
 인접 루프의 융합
튜닝 전
튜닝 후
DO I=1,N
DO I=1,N
S = S + B(I) * A(I)
ENDDO
DO I=1,N
S = S + B(I) * A(I)
R(I) = C(I) + D(I)
ENDDO
R(I) = C(I) + D(I)
ENDDO
Supercomputing Center
53
캐시 메모리를 위한 튜닝 (10/17)
 루프의 중간지점 양분
튜닝 전
튜닝 후
DO I=1,N
NHALF = N/2
S = S + B(I) * A(I)
ENDDO
S0=0.D0
S1=0.D0
DO I=1,NHALF
S0 = S0 + A(I)*B(I)
S1 = S1 + A(I+NHALF)*B(I+NHALF)
ENDDO
IF(2*NHALF.NE.N) S0 = S0 + A(N)*B(N)
S = S0+S1
Supercomputing Center
54
캐시 메모리를 위한 튜닝 (11/17)
 데이터 프리패칭 흐름의 수에 따른 POWER4 데이터 전송률
Supercomputing Center
55
캐시 메모리를 위한 튜닝 (12/17)
 L1 캐시의 세트 조합성의 특성 고려
 배열의 주요 차원(leading dimension)을 2의 고 제곱의 배수로 정하지
말것
 L1 캐시의 세트 조합성 특성 고려 예
튜닝 전
튜닝 후
REAL*8 A(2048,75)
REAL*8 A(2046,75)
DO I=1, 75
DO I=1, 75
A(100,I) = A(100,I)*1.15
ENDDO


A(100,I) = A(100,I)*1.15
ENDDO
튜닝 전 : 2048 x REAL*8 = 16 KB, 총 75 캐시 라인 접근, 모든 캐시 라인
이 같은 합동 클래스에 존재, 2웨이 세트 조합성을 갖는 L1 데이터 캐시에
서 오직 2개의 캐시 라인만 활용 가능
개선 방법 : 배열의 주요 차원을 2064(2048+16, 캐시 라인 길이),
2056( 2048+8, 캐시 라인 반 길이), 2046(2048–2) 등의 크기로 정의
Supercomputing Center
56
캐시 메모리를 위한 튜닝 (13/17)
 데이터 캐시 블로킹
 처리할 데이터(배열)가 너무 커서 캐시에 맞지 않으면 캐시에 맞는 크기
의 블록들로 나누어서 처리하는 것
 POWER4 시스템에서는 1440KB 크기의 L2 캐시를 맞출 대상으로 함
 블로킹의 효과 여부를 결정짓는 두 가지 요소


스트라이드 1 : 모든 데이터가 스트라이드 1로 접근되는지의 여부
데이터 재사용 : 각 데이터 요소들이 하나 이상의 산술 연산에서 사용되는
지의 여부
 블로킹의 효과 결정 요소의 조합에 따른 효과 여부

스트라이드 1, 데이터 재사용 없을 경우 : 블로킹 이득 없음
DO J = 1, N !Summed dot products
DO I = 1, N
S = S + A(I,J)*B(I,J) !Each elements of A and B used just once
ENDDO
ENDDO
Supercomputing Center
57
캐시 메모리를 위한 튜닝 (14/17)

일부 배열 스트라이드 1 아니고, 데이터 재사용 없을 경우 : 어느 정도 블로
킹 이득 있음
DO J = 1, N !Summed dot products with transposed array
DO I = 1, N
S = S + A(J,I)*B(I,J)
ENDDO
ENDDO

스트라이드 1, 많은 데이터 재사용의 경우 : 어느 정도 블로킹 이득 있음
DO I = 1, N !Matrix multiply transpose
DO J = 1, N
DO K = 1, N
D(I,J) = D(I,J) + A(K,J)*B(K,I)
ENDDO
ENDDO
ENDDO
Supercomputing Center
58
캐시 메모리를 위한 튜닝 (15/17)

일부 배열 스트라이드 1 아니고, 많은 데이터 재사용의 경우 : 블로킹 필수
이며, 컴파일러 옵션을 사용하지 않고 일반적으로 수동 튜닝
DO I = 1, N !Matrix multiply
DO J = 1, N
DO K = 1, N
D(I,J) = D(I,J) + A(J,K)*B(K,I)
ENDDO
ENDDO
ENDDO

블로킹 예
블록의 크기 = NBxNB 요소 수
이 예에서 블로킹이 효과적으로 되기 위해서는 세 개의 NBxNB 블록들이 L2 캐시
에 동시에 로드될 수 있도록 NB의 크기가 결정되어야 함
POWER4 칩의 경우 두 개의 프로세서가 L2를 공유하므로 NB 크기의 결정이 좀
더 복잡해 짐
Supercomputing Center
59
캐시 메모리를 위한 튜닝 (16/17)

블로킹 예
DO II = 1, N, NB !3 blocking loops
DO JJ = 1, N, NB
DO KK = 1, N, NB
DO I = II, MIN(N,II+NB-1) !In-cache loops START
DO J = JJ, MIN(N, JJ+NB-1)
DO K = KK, MIN(N, KK+NB-1)
D(I,J) = D(I,J) + A(J,K)*B(K,I)
ENDDO
ENDDO
ENDDO !In-cache loops END
ENDDO
ENDDO
ENDDO
Supercomputing Center
60
캐시 메모리를 위한 튜닝 (17/17)
 N 바이트의 임의 데이터를 접근하기 위한 지연 사이클
Supercomputing Center
61
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 / 사이클
Supercomputing Center
62
FPU를 위한 튜닝 (2/13)
 POWER3 프로세서에서 FPU의 슈퍼스칼라 파이프라인
Supercomputing Center
63
FPU를 위한 튜닝 (3/13)
 기타 부동소수점 연산


덧셈, 뺄셈, 곱셈 연산은 FMA 연산으로 변환, 같은 처리 시간 소요
부동소수점 나눗셈 연산 : 슈퍼스칼라 파이프라인을 이용하지 않음
명령어
소요 사이클 수
부동소수점 덧셈, 뺄셈, 곱셈, FMA
1
부동소수점 나눗셈
30
하드웨어 제곱근
36
내재함수 sin, cos
15 ~ 45
내재함수 tan
110
내재함수 pow
405 (MASS 183)
내재함수 exp
89 (MASS 42)
내재함수 log
165 (MASS 84)
내재함수 sqrt
125 (MASS72)
정수 덧셈뺄셈 / 곱셈 / 나눗셈
1 / 3 / 30
Supercomputing Center
64
FPU를 위한 튜닝 (4/13)
 최고의 GFlops를 위한 수치 연산 루프의 조율 방법




L1과 L2 캐시 내에서 효율적으로 동작하도록 조정
나눗셈, 제곱근, 함수 호출 등을 금지
루프 내에 FMA 연산만 포함하도록 조정
FMA연산들을 독립적이고, 깊이 6의 FMA 연산 파이프라인 두 개를 채
우기 위해서 12개 이상 포함하도록 조정
 루프가 FMA에 한정(bound)되도록 조정


FMA 연산에 소요되는 사이클과 FMA 이외의 연산에 소요되는 사이클을 비
교
RISC 프로세서의 특성상 FMA 이외의 연산들이 FMA 연산과 동시에 실행
될 것이므로, FMA 연산에 소요되는 사이클 수와 동일하거나 더 적게 수행
되도록 조정하여 전체 연산이 FMA 연산에 의해 한정되도록 조정
Supercomputing Center
65
FPU를 위한 튜닝 (5/13)
 FPU를 위한 튜닝
 캐시 메모리를 위한 튜닝과는 다르게 컴파일러에 의해서 최적화
 안쪽 루프의 언롤링





FPU 파이프라인을 최대한 활용할 수 있도록 튜닝
루프 내에 적어도 12개의 독립적인 FMA 연산이 포함되어야 함
L1 캐시 지연을 극복하기 위해 명령어 흐름 상 로드가 FMA보다 적어도 4
사이클 정도 선행되도록 조정
로드와 스토어의 수가 FMA 연산의 수보다 작거나 같아야 하며, 그렇지 않
으면 로드/스토어 시간이 지배적이 됨
수동 언롤링을 할 때는 –qnounroll 옵션으로 컴파일러와의 중복을 방지하
고, 보통은 컴파일러에 의해서 자동으로 최적화할 수 있음
 바깥쪽 루프의 언롤링


로드+스토어에 대한 FMA 연산의 비를 증가시키고자 할 때 사용
데이터 재사용의 경우에 적용 가능하며, 보통 수동으로 언롤링
Supercomputing Center
66
FPU를 위한 튜닝 (6/13)
 바깥쪽 루프 언롤링의 예 1
 튜닝 전
DO I = 1, N
DO J = 1, N
Y(I) = Y(I) + X(J)*A(J,I)
ENDDO
ENDDO


스트라이드 1이 되도록 잘 작성되었으나, 로드+스토어 연산에 한정됨
컴파일러가 안쪽 루프를 언롤링해도 FMA 연산에 한정되지 않음
안쪽 루프 4회 : 8로드(X(J), A(J,I)), 0스토어, 4FMA

수동으로 바깥쪽 루프를 언롤링해서 FMA 연산에 한정되도록 조정해야 함
Supercomputing Center
67
FPU를 위한 튜닝 (7/13)
 튜닝 후
DO I = 1, N, 4
Y(I) = S0
S0 = Y(I)
Y(I+1) = S1
S1 = Y(I+1)
Y(I+2) = S2
S2 = Y(I+2)
Y(I+3) = S3
S3 = Y(I+3)
ENDDO
DO J = 1, N
S0 = S0 + X(J)*A(J,I)
S1 = S1 + X(J)*A(J,I+1)
S2 = S2 + X(J)*A(J,I+2)
S3 = S3 + X(J)*A(J,I+3)
ENDDO


루프 언롤링 깊이(depth) 4까지 튜닝한 예
로드+스토어 연산에 대한 FMA 연산의 비가 튜닝 전보다 증가 됨
안쪽 루프 4회 : 5로드(X(J), A(J,I)…A(J,I+3)), 0스토어, 4FMA
Supercomputing Center
68
FPU를 위한 튜닝 (8/13)
 바깥쪽 루프 언롤링의 효과(행렬-벡터 곱, 1.1GHz)
Supercomputing Center
69
FPU를 위한 튜닝 (9/13)
 바깥쪽 루프 언롤링의 예 2
 행렬 곱에 대한 MxN 언롤링
 튜닝 전
DO I = II, MIN(N,II+NB-1)
DO J = JJ, MIN(N,JJ+NB-1)
DO K = KK, MIN(N,KK+NB-1)
D(I,J) = D(I,J) + A(J,K)*B(K,I)
ENDDO
ENDDO
ENDDO


행렬 곱 알고리즘의 루프에서 데이터 캐시 블로킹 테크닉을 적용한 코드가
복잡하게 보이는 것은 줄이기 위해 블로킹 루프는 제외시키고 캐시에 들어
가는 부분만 표시
로드+스토어 연산에 한정됨
안쪽 루프 : 2로드(A(J,K), B(K,I)), 0스토어, 1FMA
Supercomputing Center
70
FPU를 위한 튜닝 (10/13)
 튜닝 1 : 임시 변수의 도입
DO I = II, MIN(N,II+NB-1)
DO J = JJ, MIN(N,JJ+NB-1)
S = D(I,J)
DO K = KK, MIN(N,KK+NB-1)
S = S + A(J,K)*B(K,I)
ENDDO
ENDDO
ENDDO


개선된 듯 보이지만, 안쪽 루프에서 보면 튜닝 전과 별 차이 없음
로드+스토어에 한정됨
Supercomputing Center
71
FPU를 위한 튜닝 (11/13)
 튜닝 2 : 5x4 언롤링 (1/3)
DO I = II, MIN(N,II+NB-1), 5
DO J = JJ, MIN(N,JJ+NB-1), 4
S32 = D(I+3,J+2)
S42 = D(I+4,J+2)
S00 = D(I+0,J+0)
S03 = D(I+0,J+3)
S10 = D(I+1,J+0)
S13 = D(I+1,J+3)
S20 = D(I+2,J+0)
S23 = D(I+2,J+3)
S30 = D(I+3,J+0)
S33 = D(I+3,J+3)
S40 = D(I+4,J+0)
S43 = D(I+4,J+3)
S01 = D(I+0,J+1)
DO K = KK, MIN(N,KK+NB-1)
S11 = D(I+1,J+1)
S00 = S00 + A(J+0,K)*B(K,I+0)
S21 = D(I+2,J+1)
S10 = S10 + A(J+0,K)*B(K,I+1)
S31 = D(I+3,J+1)
S20 = S20 + A(J+0,K)*B(K,I+2)
S41 = D(I+4,J+1)
S30 = S30 + A(J+0,K)*B(K,I+3)
S02 = D(I+0,J+2)
S40 = S40 + A(J+0,K)*B(K,I+4)
S12 = D(I+1,J+2)
S01 = S01 + A(J+1,K)*B(K,I+0)
S22 = D(I+2,J+2)
S11 = S11 + A(J+1,K)*B(K,I+1)
Supercomputing Center
72
FPU를 위한 튜닝 (12/13)
 튜닝 2 : 5x4 언롤링 (2/3)
S21 = S21 + A(J+1,K)*B(K,I+2)
D(I+1,J+0) = S10
S31 = S31 + A(J+1,K)*B(K,I+3)
D(I+2,J+0) = S20
S41 = S41 + A(J+1,K)*B(K,I+4)
D(I+3,J+0) = S30
S02 = S02 + A(J+2,K)*B(K,I+0)
D(I+4,J+0) = S40
S12 = S12 + A(J+2,K)*B(K,I+1)
D(I+0,J+1) = S01
S22 = S22 + A(J+2,K)*B(K,I+2)
D(I+1,J+1) = S11
S32 = S32 + A(J+2,K)*B(K,I+3)
D(I+2,J+1) = S21
S42 = S42 + A(J+2,K)*B(K,I+4)
D(I+3,J+1) = S31
S03 = S03 + A(J+3,K)*B(K,I+0)
D(I+4,J+1) = S41
S13 = S13 + A(J+3,K)*B(K,I+1)
D(I+0,J+2) = S02
S23 = S23 + A(J+3,K)*B(K,I+2)
D(I+1,J+2) = S12
S33 = S33 + A(J+3,K)*B(K,I+3)
D(I+2,J+2) = S22
S43 = S43 + A(J+3,K)*B(K,I+4)
D(I+3,J+2) = S32
ENDDO
D(I+4,J+2) = S42
D(I+0,J+0) = S00
D(I+0,J+3) = S03
Supercomputing Center
73
FPU를 위한 튜닝 (13/13)
 튜닝 2 : 5x4 언롤링 (3/3)
D(I+1,J+3) = S13
D(I+2,J+3) = S23
D(I+3,J+3) = S33
D(I+4,J+3) = S43
ENDDO
ENDDO




안쪽 루프 : 9로드(A(J+0,K)…A(J+3,K), B(K,I+0)…B(K,I+4)), 20FMA
29 부동소수점 레지스터 사용
행렬의 인수분해(factorization)에서도 유사한 방법 적용 가능
ESSL의 DGEMM() 함수도 비슷한 최적화 방법을 적용
Supercomputing Center
74
컴파일러를 이용한 최적화 (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의 최적화
레벨 옵션 사용을 권장
Supercomputing Center
75
컴파일러를 이용한 최적화 (2/15)
 -O 혹은 -O2 사용시의 최적화 내용






전체적으로 사용자 변수를 레지스터에 할당
update와 같은 어드레싱 모드의 효과적인 사용
사용되지 않거나 불필요하게 과한 코드 부분의 제거
변하지 않는 코드 부분을 루프 밖으로 이동
프로그램의 실행 기계에 대한 명령어 스케줄링
루프 언롤링과 스케줄링
 -O3 사용시의 최적화 내용





안쪽 루프의 언롤링
개선된 루프 스케줄링
-qnostrict 옵션을 함께 사용하면 –qstrict 옵션에 의한 제한을 무시하는 추
가적인 최적화를 허용
보통 전체 프로시저에 해당하는 최적화 범위의 확대
암시적으로 적용되는 -qmaxmem=-1 옵션에 의해 최적화를 위해 사용하는
메모리 제한 없음
Supercomputing Center
76
컴파일러를 이용한 최적화 (3/15)
 최적화 레벨 옵션 사용시의 팁
 최적화 레벨 옵션을 사용하기 전에 프로그램의 실행여부를 테스트하고
디버깅
 최적화를 수행하는 컴파일 옵티마이저는 표준에 대한 적합성 여부를 검
사하고, 표준에 충실히 따른 프로그램의 최적화를 가장 잘 수행하므로
프로그램을 작성할 때는 표준을 따르도록 작성



Fortran 프로그램의 경우 서브루틴의 매개 변수들이 별칭(alias) 규칙을 따
르도록
C 프로그램의 경우 포인터를 사용할 때의 형(type) 제한을 따르도록
모든 공유변수들이 휘발성(volatile)의 특성을 가짐을 명시한다.
 우선, 프로그램을 구성하는 최대한 많은 코드 부분을 –O2로 컴파일
 -O2로 문제점이 생기는 부분에 대해서는 최적화 레벨 옵션의 사용을 포
기하지 말고 -qalias=noansi 혹은 -qalias=nostd 옵션을 추가로 적용
Supercomputing Center
77
컴파일러를 이용한 최적화 (4/15)
 그 다음, -O2로 컴파일 된 부분을 포함한 최대한 많은 코드 부분을 -O3
로 컴파일
 -O3 최적화 레벨 옵션으로 문제점이 생기거나 -O2보다 성능저하가 나
타난다면 해당 부분에 대해서 -O3와 함께 -qstrict 혹은 -qcompact 옵
션을 추가로 적용
 그래도 문제점이 없어지지 않는다면, 해당 서브루틴이나 파일에 대해서
만 -O2를 적용하고 -O2와 함께 -qmaxmem=-1 옵션과 -qnostrict 옵션
을 사용
 실행 대상 시스템 옵션
 IBM XL Fortran 및 VisualAge C/C++ 컴파일러들은 크로스컴파일러
 컴파일된 프로그램을 실행할 시스템의 아키텍처, 비트 모드, 공유 메모
리 병렬 시스템인지의 여부 등의 특성에 따라 컴파일 옵션을 추가로 사
용
Supercomputing Center
78
컴파일러를 이용한 최적화 (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 중의 하나
Supercomputing Center
79
컴파일러를 이용한 최적화 (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 옵션이 유용하게 쓰일 수 있음
Supercomputing Center
80
컴파일러를 이용한 최적화 (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와 동일
Supercomputing Center
81
컴파일러를 이용한 최적화 (8/15)
 SMP 옵션 사용시의 팁
 -qsmp 옵션을 사용하기 전에 최적화 및 단일 스레드 방식에서 –qhot
옵션을 사용하여 프로그램의 컴파일 및 실행 이상 유무를 검사
 -qsmp 옵션을 사용할 때는 항상 ‘_r’로 끝나는 스레드용 컴파일러 명령
을 사용
 이렇게 컴파일 된 프로그램이 실행될 때는 기본적으로 시스템 내에서
모든 유효 프로세서들을 사용해서 멀티 스레딩 방식으로 실핼될 것이므
로, 유효한 프로세서 수보다 적은 수의 스레드를 사용하고자 하는 것이
아니라면, PARTHDS나 OMP_NUM_THREADS와 같은 스레드 수를
지정하는 환경 변수를 사용하지 않음
 벤치마크 테스트와 같은 목적으로 시스템이나 노드를 전용(dedicated)
해서 사용한다면 SPINS와 YIELDS 환경 변수의 값을 0으로 설정해서
스레드가 sleep-waiting 모드로 진입하는 것을 방지, 프로그램의 실행
소요시간을 줄이는 효과를 볼 수 있음
Supercomputing Center
82
컴파일러를 이용한 최적화 (9/15)
 OpenMP 프로그램을 디버깅할 때는 컴파일러로부터 디버깅 정보를 보
다 정확하게 얻기 위해서 최적화 옵션 없이 –qsmp=noopt 옵션을 사용
 기타 옵션
 최적화 레벨 옵션의 –O4 및 –O5 매크로 옵션에 포함된 최적화 관련 컴
파일 옵션 및 기타 유용하게 사용될 수 있는 옵션들
 HOT(High Order Transformations) 옵션 – Fortran


–qhot[=[no]vectoer | arraypad[=n]]으로 지정
임시변수의 제거, 문(statement) 융합과 같은 F90 배열 언어 구문의 최적
화된 처리, 캐쉬/TBL 미스(miss)를 줄이기 위한 메모리 위치 개선, 하드웨
어 프리패칭의 최적 사용, 로드/스토어와 부동소수점 루프 연산의 균형 유
지를 위해 중첩 루프를 교환하는 등의 고 수준 변형, 역수, 제곱근, 삼각함수
등의 벡터 내재함수 라이브러리를 이용하기 위한 임의의 루프 변형 등을 수
행
Supercomputing Center
83
컴파일러를 이용한 최적화 (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는
수집된 데이터를 사용해서 최적화할 때 사용. 두 옵션을 다음의 세 단계에
걸쳐서 사용
Supercomputing Center
84
컴파일러를 이용한 최적화 (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) 테이블 정보의 생성을 조정
Supercomputing Center
85
컴파일러를 이용한 최적화 (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
옵션을 사용해서 문제점을 해결
Supercomputing Center
86
컴파일러를 이용한 최적화 (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 형식으로 지정하
며, 컴파일러가 특정 변수들은 중복 저장 공간을 참조하지 않는다고 가정하
는 것을 허용
Supercomputing Center
87
컴파일러를 이용한 최적화 (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 코드를 포함하는 리포트를 만들도록 지시. 리포트
에는 데이터 의존성 및 다른 최적화 방해물에 관한 정보도 포함
Supercomputing Center
88
컴파일러를 이용한 최적화 (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
Supercomputing Center
89
튜닝을 위한 컴파일러 지시어 (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.
Supercomputing Center
90
성능 향상을 위한 코딩 팁 (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++.
Supercomputing Center
91
성능 향상을 위한 코딩 팁 (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
Supercomputing Center
92
성능 향상을 위한 코딩 팁 (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.
Supercomputing Center
93
성능 향상을 위한 코딩 팁 (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
Supercomputing Center
94
성능 향상을 위한 코딩 팁 (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.
Supercomputing Center
95
병렬 프로그래밍 테크닉 (1/10)
 공유 메모리 병렬 작업 흐름
Supercomputing Center
96
병렬 프로그래밍 테크닉 (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)
 커널/유저 스레드
 스레드 : 스케줄의 대상이 되는 단위
 커널 스레드


커널에 의해 스케줄
시스템 스케줄러가 담당
 유저 스레드


사용자에 의해 스케줄
스레드 라이브러리가 담당
Supercomputing Center
97
병렬 프로그래밍 테크닉 (3/10)
 M:1 스레드 모델
Supercomputing Center
98
병렬 프로그래밍 테크닉 (4/10)
 1:1 스레드 모델
Supercomputing Center
99
병렬 프로그래밍 테크닉 (5/10)
 M:N 스레드 모델
Supercomputing Center 100
병렬 프로그래밍 테크닉 (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
Supercomputing Center 101
병렬 프로그래밍 테크닉 (7/10)
 루프 A
DO J = 1, NX
Q(J) = E(J) + F2*Q(J)
ENDDO
 루프 B
DO J = 1, NX
E(J) = Y3(J)*Q(J) - ( \
I1 = IL(1,J)
Q2(1,J)*Q(I1) + Q2(2,J)*Q(I2) + \
I2 = IL(2,J)
Q2(3,J)*Q(I3) + Q2(4,J)*Q(I4) + \
I3 = IL(3,J)
Q2(5,J)*Q(I5) + Q2(6,J)*Q(I6))
I4 = IL(4,J)
F3 = F3 + Q(J)*E(J)
I5 = IL(5,J)
ENDDO
I6 = IL(6,J)
Supercomputing Center 102
병렬 프로그래밍 테크닉 (8/10)
 루프 C
DO J = 1, NX
Z0(J) = Z0(J) + X2*Q(J)
B1(J) = B1(J) - X2*E(J)
T1 = B1(J)
E(J) = T1*DBLE(C1(J))
F1 = F1 + T1*E(J)
F4 = F4 + ABS(T1)
ENDDO
 환경 변수 지정





export AIXTHREAD_SCOPE=S
export SPINLOOPTIME=100000
export YIELDLOOPTIME=40000
export OMP_DYNAMIC=false
export MALLOCMULTIHEAP=1
Supercomputing Center 103
병렬 프로그래밍 테크닉 (9/10)
 실행 결과 (NX=1000000)

루프 A

루프 B
Supercomputing Center 104
병렬 프로그래밍 테크닉 (10/10)

루프 C
Supercomputing Center 105
제 III 장
병렬 프로그래밍 관련 도구
 디버깅 도구
 성능분석 도구
디버깅 도구 (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
Supercomputing Center 107
성능분석 도구 (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
Supercomputing Center 108
성능분석 도구 (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에 그 내용이 있음
 사용자가 프로그램의 성능분석에 자주 이용하는 정보를 담은 몇 개의
그룹들
Supercomputing Center 109
성능분석 도구 (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 포함) 회수 등
Supercomputing Center 110
성능분석 도구 (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.
Supercomputing Center 111
성능분석 도구 (5/37)
 hpmcount 사용 예제와 실행결과
$ hpmcount -o hpmtest -n –g 60 a.out
Seconds elapsed: 20.1621870994567871
$ vi hpmtest_0000.384218
hpmcount (V 2.4.3) summary
Total execution time (wall clock time): 3.890695 seconds
######## Resource Usage Statistics ########
Total amount of time in user mode
Total amount of time in system mode
Maximum resident set size
: 3.800000 seconds
: 0.060000 seconds
: 23564 Kbytes
Average shared memory use in text segment
: 3088 Kbytes*sec
Average unshared memory use in data segment : 9007560 Kbytes*sec
Number of page faults without I/O activity : 5893
Supercomputing Center 112
성능분석 도구 (6/37)
Number of page faults with I/O activity
:0
Number of times process was swapped out
:0
Number of times file system performed INPUT : 0
Number of times file system performed OUTPUT : 0
Number of IPC messages sent
:0
Number of IPC messages received
Number of signals delivered
:0
:0
Number of voluntary context switches
Number of involuntary context switches
:4
:3
####### End of Resource Statistics ########
PM_FPU_FDIV (FPU executed FDIV instruction)
:
PM_FPU_FMA (FPU executed multiply-add instruction)
0
:
1000002329
PM_FPU0_FIN (FPU0 produced a result)
:
627844244
PM_FPU1_FIN (FPU1 produced a result)
:
1377820044
PM_CYC (Processor cycles)
:
3758316603
PM_FPU_STF (FPU executed store instruction)
PM_INST_CMPL (Instructions completed)
:
:
1003408033
4143170873
Supercomputing Center 113
성능분석 도구 (7/37)
PM_LSU_LDF (LSU executed Floating Point load instruction) :
Utilization rate
:
74.306 %
Load and store operations
:
Instructions per load/store
:
MIPS
:
3005.620 M
1.3786
1064.892
Instructions per cycle
:
1.102
HW Float points instructions per Cycle
:
0.534
Floating point instructions + FMAs
:
2002.259 M
Float point instructions + FMA rate
:
514.627 Mflip/s
FMA percentage
99.887 %
Computation intensity
2002211584
:
:
0.666
 위의 실행결과에서 수집된 정보


Utilization rate = User time / Wall clock time
Load and store operations = Loads + Stores(Total LS)
2002211584 + 1003408033 = 3005619617 = 3005.620 M
Supercomputing Center 114
성능분석 도구 (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
Supercomputing Center 115
성능분석 도구 (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와 동일
한 정보를 제공함
Supercomputing Center 116
성능분석 도구 (10/37)
 Xprofiler
 PE 제품군에 속한 병렬 프로파일링 도구
 프로그램을 컴파일할 때 –pg옵션을 주고 컴파일하여 실행을 하면
xprofiler를 이용하여 프로그램의 어떤 서브루틴에서 시간이 얼마나 걸
렸으며, 각 서브루틴들에서 걸린 시간이 전체 계산시간에서 어떻게 분
포가 되는지 등에 대한 여러가지 정보들을 그래픽 환경에서 확인해 볼
수 있음
 실행파일이 md_small.x이고 실행시킨 후 생성된 파일이 gmon.out이
라고 할 때 다음과 같이 실행하면 된다.
$ xprofiler md_small.x gmon.out
Supercomputing Center 117
성능분석 도구 (11/37)
 Xprofiler GUI 창

여기서 library에 해당되는 부분을 숨기려면 메뉴에서 Filter -> Hide All
Library Calls를 클릭
Supercomputing Center 118
성능분석 도구 (12/37)
 클러스터 노드 메뉴 : 녹색의 사각 박스의 회색부분에 오른쪽 마우스를
클릭
Supercomputing Center 119
성능분석 도구 (13/37)
 Remove Cluster Box를 클릭하면 md_small.x에 해당되는 부분이 확
대됨
Supercomputing Center 120
성능분석 도구 (14/37)
 찾고자 하는 부분 확대 : 메뉴에서 View -> Overview 를 클릭
Overview Window를 띄운 다음 파란색의 사각형을 작게 축소하면 그
부분에 해당되는 부분을 전체 화면에서 확대해 볼 수 있음
Supercomputing Center 121
성능분석 도구 (15/37)
 각 창의 그림에서 크고 작은 크기의 녹색 사각형이 나타나는데 이 녹색
사각형 바로 밑에 A x B 형태로 계산 시간이 적혀 있고, 다시 그 밑에 서
브루틴의 이름이 적혀 있음
 A x B 형태로 적힌 계산 시간에서 B에 해당하는 시간은 순수하게 그 서
브루틴에서 걸린 시간을 나타내고, A에 해당하는 시간은 하위 서브루틴
에서 걸린 시간과 B에 해당하는 시간을 합친 그 루틴의 전체 계산시간
을 나타냄
 또한, 녹색 사각형에서 가로의 길이는 위의 A에 해당하는 시간을 나타
내고 세로의 길이는 위의 B에 해당하는 시간을 나타냄
 순차코드를 병렬화 할 때 위와 같이 프로파일링을 한 후 녹색으로 표시
된 사각형의 면적이 넓은 곳을 찾아서 효율적으로 병렬화를 할 수 있음
Supercomputing Center 122
성능분석 도구 (16/37)
 Report 메뉴를 통해 다양한 프로파일링 정보를 확인해 볼수 있으며, 특
히 Report -> Flat profile를 이용하여 플랫 프로파일링 정보를 확인할
수 있음
Supercomputing Center 123
성능분석 도구 (17/37)
 Flat profile 창의 Code Display -> Show Source Code 메뉴를 통해
선택한 서브루틴의 소스코드를 확인해 볼 수 있음
Supercomputing Center 124
성능분석 도구 (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인 프로세스의 정보가 포함되어 있음
Supercomputing Center 125
성능분석 도구 (19/37)
 mpi_profile.* 파일에 포함된 정보
---------------------------------------------------------------MPI Routine
#calls
avg. bytes
me(sec)
---------------------------------------------------------------MPI_Comm_size
1
0.0
0.000
MPI_Comm_rank
1
0.0
0.000
MPI_Reduce
1
8.0
0.000
---------------------------------------------------------------total communication time = 0.000 seconds.
total elapsed time
= 3.033 seconds.
user cpu time
= 1.580 seconds.
system time
= 0.250 seconds.
maximum memory size
= 3148 KBytes.
---------------------------------------------------------------Message size distributions:
MPI_Reduce
#calls
1
8.0
avg. bytes
time(sec)
0.000
Supercomputing Center 126
성능분석 도구 (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 파일로 합침
Supercomputing Center 127
성능분석 도구 (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 프로그램 성능분석으로 나누어
볼 수 있음
Supercomputing Center 128
성능분석 도구 (22/37)
 PCT/UTE 사용
Supercomputing Center 129
성능분석 도구 (23/37)
 PCT/PVT 사용
Supercomputing Center 130
성능분석 도구 (24/37)

PCT : X윈도 GUI/명령어 방식
Supercomputing Center 131
성능분석 도구 (25/37)

PVT : X윈도 GUI/명령어 방식
Supercomputing Center 132
성능분석 도구 (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
Supercomputing Center 133
성능분석 도구 (27/37)
 PCT 실행

사용자의 시스템에서 PCT를 GUI로 사용하기 위해서는 적절한 X윈도우 환
경이 우선적으로 설정되어 있어야 함
$ pct

Load a new application 선택, OK 클릭(Load Application 윈도우 열림)
Supercomputing Center 134
성능분석 도구 (28/37)

Load Application 윈도우에서
SPMD parallel을 선택하고
Executable name 필드에서
Browse 버튼을 이용하여 성능
분석이 필요한 프로그램을 선택

POE Arguments 필드에 적절한
POE 실행 옵션 기입. 예를 들면,
병렬실행에 참여하는 프로세스
개수(–procs n) 등을 기입

Load 버튼을 클릭하여 프로그램
을 로드(Probe Data Selection
윈도우 열림)
Supercomputing Center 135
성능분석 도구 (29/37)


수집을 원하는 데이터의 타입을 선택하는데 지금과 같이 MPI 프로그램 성
능분석을 위해서는 MPI and user event traces를 선택해야 하지만 만약
하드웨어/운영체제 성능 데이터를 원한다면 Hardware and operating
system profiles를 선택해야 함
출력파일이 생성될 디렉터리와 기본파일명을 적어주고 OK를 클릭(메인 윈
도우가 열림)
Supercomputing Center 136
성능분석 도구 (30/37)





메인 윈도우 Process  Select All Connected, Source Tree에서
pipelined.f 선택
Probe Selection 영역에서 All MPI Events를 선택
Add 버튼을 클릭해 필요한 정보 수집을 위한 탐침(probe)을 설치
메뉴 바에서 Application  Start를 선택해 프로그램을 실행
프로그램의 실행 완료후 PCT 종료
Supercomputing Center 137
성능분석 도구 (31/37)



위와 같은 과정을 거쳐 성공적으로 메시지 패싱에 대한 데이터를 수집했다
면 AIX 트레이스 파일이 생성
이 트레이스 파일은 각 노드마다 하나씩 생성되는데, 위의 예에서 사용한
네 개의 프로세스 모두를 하나의 노드에서 실행되도록 했다면 트레이스 파
일은 mytrace.#의 형식으로 하나가 생성
여기서 #은 프로세스가 네 개이므로 0부터 3까지의 값 중 임의의 값을 하나
가지게 됨
 uteconvert 실행

생성된 AIX 트레이스 파일을 uteconvert를 이용하여 UTE interval 파일로
변환
 기본적으로 트레이스 파일의 이름을 그대로 가져와 mytrace.ute.# 파일이
생성되지만 –o 옵션을 이용하여 원하는 이름을 지정해 줄 수 있음
$ uteconvert mytrace.1
$ uteconvert –o tracefile.ute mytrace.1
Supercomputing Center 138
성능분석 도구 (32/37)
 slogmerge 실행

수집한 정보를 Jumpshot에서 볼 수 있도록 slogmerge를 이용해 UTE
interval 파일을 SLOG 파일로 변환
 기본적으로 (UTE 파일 이름).slog 파일이 생성되지만 역시 –o 옵션을 이용
하면 원하는 이름을 지정해 줄 수 있음
$ slogmerge mytrace.ute.1
$ slogmerge –o tracefile.slog tracefile.ute
Supercomputing Center 139
성능분석 도구 (33/37)
 Jumpshot
 Jumpshot은 PE Benchmarker 툴셋에 포함된 프로그램이 아니며 이
는 미국 Argonne 국립 연구소에서 개발한 공개 MPI 구현 패키지인
MPICH/MPE에 포함된 자바기반의 성능분석 가시화 툴
 KISTI IBM 시스템의 /applic/bin 디렉토리에 jumbshot이라는 이름으
로 설치되어 있으며 인터넷에서 받아 개별적으로 설치해 사용할 수도
있음
 GUI 기반의 Jumpshot도 PCT와 마찬가지로 실행하기 전에 적절한 X
윈도우 설정이 필요
Supercomputing Center 140
성능분석 도구 (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 윈도우
를 볼 수 있음
Supercomputing Center 141
성능분석 도구 (35/37)

View & Frame Selector 윈도우
Supercomputing Center 142
성능분석 도구 (36/37)

Time Lines 윈도우
Supercomputing Center 143
성능분석 도구 (37/37)




Time Line 윈도우의 X축은 프로그램의 진행시간을 Y축은 프로세스 랭크
를 표시
MPI 서브루틴은 하나의 box로 표현되고 함수 내부 혹은 함수 사이의 통신
은 화살표로 표시
상단의 Zoom Operations에서 In/Out 버튼을 이용하여 선택한 프레임의
MPI 이벤트 발생을 좀더 자세히 살펴볼 수 있음
사용자는 Time Line 윈도우의 MPI 프로그램 진행상황과 통신특성 등을 살
펴보고 자신의 프로그램에 대한 성능분석을 한 후 적절한 최적화 방안을 마
련할 수 있음
Supercomputing Center 144
제 IV 장
참고 자료 및 부록
 참고 자료
참고 자료 (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월)
Supercomputing Center 146