[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
PYCON Korea 2015
Python은 과학 계산 분야에서도 이미 널리 사용되고 있습니다. numpy와 scipy 기반으로 만들어진 많은 모듈들이 휼륭한 생태계를 이루고 있기 때문입니다. 그러나 극한의 계산 성능을 요구하는 분야(HPC, High Performance Computing)에서는 여전히 C와 Fortran으로만으로 짜여진 코드들이 선호되고 있습니다. 이런 분야에서 Python에 대한 일반적인 견해는 전처리/후처리에는 유용하지만 메인 코드에 적용하기에는 느리다라는 것입니다.
이번 발표에서는 HPC 분야에서도 Python의 유용함을 보여줍니다. 계산이 집중된 부분만을 Fortran, C로 구현하여 Python 메인 코드에 접합하면, Python의 장점은 충분히 활용하면서도 계산 성능에 큰 손해는 보지 않을 수 있습니다. 게다가 CUDA-C, OpenCL-C와 연동하면 GPU, MIC와 같은 가속 프로세서들도 비교적 쉽게 활용할 수 있습니다. 이번 발표에서는 간단한 시뮬레이션 코드를 예제로 사용하여 Python 코드로부터 시작하여 Fortran, C, CUDA-C, OpenCL-C 등을 단계적으로 접합해 나가는 것을 보여줄 것입니다.
산포된 데이터를 정합하는 직선을 찾는 것으로 이해해도 무방합니다. 주어진 데이터를 이용해 기울기와 절편을 구하는 방법입니다.
먼저 행렬연산을 통해 구하는 방법을 설명합니다. 그리고 퍼셉트론에 사용된 것과 같은 방법을 다시 설명하므로 선택적으로 듣기 바랍니다.
설명된 예제에 대한 C 언어 코드를 제공합니다. Tensorlow 코드는 정합 과정을 시각화하여 보여줍니다.
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
Let's make APM by instrumenting Nodejs through the knowledge gained through tracing. Creating clues that facilitate tracking becomes a milestone for latecomers, like a snow-footprint.
C++은 10년 만에 C++11/14를 발표하면서 '모던 C++'이라는 이름으로 발전했습니다. 그만큼 새로운 기능들이 많이 추가되었습니다. 그리고 2017년, C++은 C++17이라는 이름으로 또 한 번의 발전을 준비하고 있습니다. 3년 주기로 빠르게 변화하는 모던 C++에 대비하기 위해, C++17에 추가될 주요 기능들을 살펴보고자 합니다.
이 발표는 이전에 발표했던 내용에서 일부 사례 추가 및 최신 내용으로 갱신한 버전입니다.
2. 목 차
기본 블록
지역 최적화
루프 최적화
전역 최적화
기계 종속적 최적화
3. Code Optimization
Definition
Preserve programming meaning
Speed up on average
Be worth the effort
분류
최적화 범위
지역 최적화(local optimization)
전역 최적화(global optimization)
최적화 코드
기계 독립적 최적화(machine-independent optimzation)
기계 종속적 최적화(machine-dependent optimization)
5. Basic Block (1/5)
지역 최적화의 기본 단위
시작부터 끝까지 순서적으로만 수행되는 문장 범위
[정의] 기본 블록
블록의 시작과 끝을 제외하고 블록의 내부 또는 외부로의 분기가 발생
하지 않는 분해된 기본 코드들의 시퀀스
기본 블록
6. Basic Block (2/5)
기본 블록 구성
leader와 다음 leader 이전에 나타나는 모든 코드
[정의] leader
(1) 프로그램의 시작 문장
(2) 조건부 분기 또는 무조건 분기의 목적지에 있는 문장
(3) 조건부 분기 바로 다음에 위치하는 문장
7. Basic Block (3/5)
i := 1
GOTO L2
L1 : Statement1
i := i + 1;
L2 : IF i <= N GOTO L1
Statement2
FOR i := 1 TO N DO
Statement1;
Statement2;
8. Basic Block (4/5) - Flow Graph
흐름 그래프(Flow Graph)
기본 블록에 제어 흐름 정보를 추가핚 방향 그래프
전역 최적화에 필수
initial
L1: Statement1
i := i + 1
i := 1
GOTO L2
L2 : IF i <= N GOTO L1
Statement2
B1
B3
B4
B2
9. I := 1
GOTO Itest
Iloop : J := 1
GOTO Jtest
Jloop: T1 := 4 * J
T2 := A[T1]
T3 := J + 1
T4 := 4 * T3
T5 := A[T4]
IFT2 <=T5 GOTO Jplus
T6 := 4 * J
Temp := A[T6]
A[T12] := Temp
Jplus : J := J + 1
Jtest : IF J <= I GOTO Jloop
Iplus : I := I + 1
Itest : IF I <= n – 1 GOTO Iloop
B1
B2
B3
B4
B5
B7
B6
B8
B2
B8
B1
B6
B3
B4
B5
B6
initial
10. 지역 최적화
기본 블록 내에서 최적화를 수행
기법 :
Common subexpression elimination
Strength reduction
Constant folding
Constant propagation
Algebraic simplification
11. Common Subexpression Elimination
공통 부분식의 제거
공통된 부분이 반복되어 나타나는 경우를 제거하는
방법
A := B + C + D;
E := B + C + F;
K := (B + C) * G;
T := B + C;
A := T + D;
E := T + F;
K := T * G;
12. Strength Reduction
연산 강도 경감
연산자의 비용이 적은 연산자로 바꾸는 방법
거듭제곱 -> 승산 -> 가산
제산, 승산 -> 비트이동(shift)
A = X ** 2;
Y = 3 * A;
X = A / 5;
X = A / 4;
A = X * X;
Y = A + A + A;
X = A * 0.2;
X = A rshr 2
13. Constant Folding
상수 폴딩
컴파일 시간에 상수식을 직접 계산하여 그 결과를 사용하
는 방법
X := A + 2 * 3 X := A + 6
14. Constant Propagation
상수 전파
고정된 값을 갖는 변수를 상수로 대치하는 방법
I := 2
. . .
T1 := 8
I := 2
. . .
T1 := 4 * I
I := 2
. . .
T1 := 4 * 2
Constant folding
컴파일 시간에 계산이 가
능한 연산을 계산함으로
써 실행 시간과 코드의
크기를 줄일 수 있다.
15. Algebraic Simplification
대수학적 간소화
수학적인 대수 법칙을 이용하여 식을 간소화하는 방
법
X = A + 0;
X = 1 * A;
A := 2 * B / 2;
X = A;
X = A;
A := B;
T1 := 4 * J – 1
. . .
T7 := T1 – 4 * J
T1 := 4 * J – 1
. . .
T7 := 1
16. Loop Optimization
전체 코드의 10%가 실행시간의 90%를 차지
대부분의 실행 시간을 루프 내에서 소모
기법 :
루프 불변 코드 이동
연산 강도 경감
루프 언롤링
루프 융합
영으로의 카운트
17. Loop Invariant
FOR k := 1 TO 1000 DO
c[k] := 2 * (p – q) * (n – k + 1) / (sqr(n) + n) ;
fact := 2 * (p – q) ;
denom := sqr(n) + n ;
FOR k := 1 TO 1000 DO
c[k] := fact * (n – k + 1) / denom ;
18. Loop Unrolling
루프의 반복 횟수를 감소시키는 방법
FOR k := 1 TO 1000 DO
c[k] := 0 ;
FOR k := 1 TO 1000 STEP 2 DO
BEGIN
c[k] := 0 ;
c[k + 1] := 0 ;
END
19. Count up to Zero
루프의 종료 조건을 검사하는 경우 0인지 아닌지를
검사하는 경우가 효율적
FOR k := 0 TO N - 1 DO
BEGIN
… k
END
FOR k := N – 1 DOWNTO 0 DO
BEGIN
… N - k
END
20. 전역 최적화
기본 블록 간의 정보와 흐름 그래프를 이용하여 프로그램
의 전체적인 흐름 분석을 통핚 최적화
기법 :
공통 부분식의 제거
전역 상수 폴딩과 전파
도달될 수 없는 코드의 제거
조건문의 재구성
연속 GOTO 축약
21. 전역 최적화
X := 1
Y : =2
T := X * Y
If (T = 2)
TRUE FALSE
X := 1
Y : =2
T := 2
If (2 = 2)
TRUE FALSE
X := 1
Y : =2
T := 2
If (2 = 2)
TRUE
22. 전역 최적화
if (true) 문장1
else 문장2;
if (x > 1) ;
else 문장;
문장1;
if (x <= 1) 문장;
23. 기계 종속적 최적화
Postcode optimizer
기법 :
중복된 load 제거
효율적인 명령어 선택
레지스터 핛당과 배정
연산 순서 재조정
목적 코드 Postcode optimizer 최적화된 목적 코드
24. 중복된 load의 제거
X := Y ;
Z := X + 1 ;
LOAD R1, Y
STORE R1, X
LOAD R1, X
ADD R1, =1
STORE R1, Z