SlideShare a Scribd company logo
1부 
프로그래밍 기법들 
1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 
Page 59 ~ 77 
NHN NEXT, NEXON 라태웅
서론 
C++ 프로그래머라면 템플릿이라는 말에서 STL, 범용 컨테이너 등을 떠올릴 것 
템플릿은 속도와 크기 모두에서 대단히 최적화된 코드를 만들어 내는 하나의 가 
상 컴파일러가 될 수 있음 
Todd Veldhuidzen과 David Vandevoorde가 어떠한 알고리즘도 템플릿화 될 수 있 
음을 보임 
이 챕터에서는 몇 가지 예제로 템플릿의 새로운 활용 방법에 대해 알아볼 것
피보나치 수열 - 정의 
피보나치 수열 : 0, 1, 1, 2, 3, 5, 8, 13, … 형태의 수열 
일반화된 공식 : Fib(n) = Fib(n-1) + Fib(n-2)
피보나치 수열 – 재귀 호출 방식 
일반적인 재귀 호출 방식 피보나치 수열 함수
피보나치 수열 – 문제 
간결하고 보기 쉬운 코드지만 수행 시간이 n에 지수적으로 증가 
따라서 게임에서 이런 코드를 실행시키는 것은 금물 
이를 템플릿화한다.
피보나치 수열 – 템플릿 방식
피보나치 수열 – 주의할 점 
템플릿 함수는 실제 함수가 아님. Val이라는 열거형 정수일 뿐 
struct으로 정의한 것은 표기를 단수화하기 위한 것일 뿐 
템플릿 인자 N은 함수의 입력을 지정하는 용도로 쓰임. 
재귀 순환을 종료하기 위한 상태를 처리해야 함. (피보나치 수열의 경우 N이 0이 
나 1일 때 종료됨)
피보나치 수열 – 컴파일 과정 
FibT(4) 컴파일 과정 
Fib<4>::Val 
= Fib<3>::Val + Fib<2>::Val 
= Fib<2>::Val + Fib<1>::Val + Fib<1>::Val + Fib<0>::Val 
= Fib<1>::Val + Fib<0>::Val + 1 + 1 + 0 
= 1 + 0 + 1 + 1 + 0 
= 3
피보나치 수열 – 컴파일 과정 
모든 입력이 컴파일 시점에서 결정 
따라서 FibT(N)은 컴파일이 끝나면 하나의 상수가 됨 
즉, 
위의 코드에서 FibT(4)는 3으로 치환 됨.
피보나치 수열 – 혁신 
알고리즘의 최적화만으로 지수적인 수행 시간을 런타임에서 상수적인 수행 시 
간으로 줄일 수 있음 
컴파일에 걸리는 시간이 늘어나겠지만, 실제 실행 속도는 매우 빨라짐.
계승(Factorial) - 정의 
계승(Factorial) : N!으로 표현하며 1*2*3*…*(N-1)*N을 의미 
이를 재귀 호출로 구하고, 템플릿 메타프로그래밍 버전으로 바꿔보자.
계승(Factorial) – 재귀 호출 방식
계승(Factorial) – 템플릿화
계승(Factorial) - 템플릿화 
피보나치 예제와 마찬가지로 FactT(4)는 상수 24가 됨 
즉, n에 비례하는 수행 시간이 런타임에서는 상수적인 수행 시간(O(1))으로 줄어 
드는 것
계승(Factorial) - 단점 
가독성 
FactT(n)과 같은 잘 정의된 매크로를 사용하면 해결 
컴파일 시간 
감수할 수 있음 (한 번만 컴파일하니까?) 
피보나치 수열이나 계승이 필요한 게임은 많지 않음 
필요로 하더라도 컴파일 시점에서 결정할 수 있는 경우는 드뭄 
게임에서 거의 필수적으로 쓰이는 삼각함수를 템플릿화 해보자
삼각함수 
템플릿 기법이 실제로 쓸모 있는 것임을 보여주는 예가 될 것 
많은 게임들이 sine 값 테이블이나 비슷한 방식을 이용해서 계산 속도를 높이는 
기법을 사용함 
만약 컴파일러가 sine(1.234) 같은 코드를 읽고 이로부터 단 하나의 move 명령을 
생성해낼 수 있다면? 
즉, sine(1.234)가 상수로 치환된다면? -> 수행 속도 매우 빨라질 것
삼각함수 
sine(x)은 으로 계산됨 
위의 식에서 x는 라디안 값이고 0 <= x < 2pie 임 
이를 재귀적으로 표현하면,
삼각함수 – 재귀 호출 방식
삼각함수 – 
템플릿화
삼각함수 – 템플릿화
삼각함수 – 템플릿화 
!!?? 왜 안돼는거야!? 하고 찾아봤더니… 
즉, float, double 같은 부동소수점은 사용할 수 없다!!
삼각함수 – 템플릿화 
하지만 이대로 포기할 수 없음 
정수 계산을 하고 부동소수점으로 변환하도록 해보자.
삼각함수 – 
템플릿화 
1.234의 경우 1234와 1000을 넣음 
단점 
매번 R/D를 수행해야함 
개선 
정수로 계산을 하고 return을 
할 때만 D로 나눠주는 방식으로 
개선할 수 있음
결론 
책에서는 템플릿 메타프로그래밍이 런타임에서 계산하는 것보다 느릴 때도 있 
지만 결론은 짱짱맨 
컴파일러마다 템플릿 처리 방식이 약간 다르고 재귀적인 호출 회수를 컴파일 중 
에 제한하는 경우도 있음 
아무튼 템플릿 짱짱맨
발표자 결론 
그러나 삼각함수의 예처럼 2000년도에는 되던 방법이 2014년에는 안되는 경우 
가 많음… 
분명 제대로 공부하고 알고 사용하면 유용할 것 같음 
차라리 미리 계산해두고 상수 값으로 쓰면 컴파일 시간도 아끼고 런타임 시간도 
아낄 수 있을텐데 굳이 템플릿 메타프로그래밍으로 해야할 필요가 있나?
발표를 마치며… 
템플릿 메타프로그래밍에 깊이가 없다보니 이게 현업에서 큰 도움이 될지는 잘 
모르겠음 
코드 가독성이 떨어지고 컴파일 시간이 늘어나고 상수 값만 넣을 수 있으니 동적 
으로 무언가 계산할 수도 없고 불편한 점이 더 많아보임 
정말 이걸 쓸 날이 올까..?
‘ GPG를 공부하자’ 페이스북 페이지 
https://www.facebook.com/gpgstudygogo

More Related Content

What's hot

Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림
Dong Chan Shin
 
Efficient Training of Bert by Progressively Stacking
Efficient Training of Bert by Progressively StackingEfficient Training of Bert by Progressively Stacking
Efficient Training of Bert by Progressively Stacking
Hoon Heo
 
REALM
REALMREALM
REALM
Hoon Heo
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
HolyTak
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례학현 김
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1학현 김
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1학현 김
 
2017 tensor flow dev summit
2017 tensor flow dev summit2017 tensor flow dev summit
2017 tensor flow dev summit
Tae Young Lee
 
15.ai term project_final
15.ai term project_final15.ai term project_final
15.ai term project_final호상 장
 
TinyBERT
TinyBERTTinyBERT
TinyBERT
Hoon Heo
 
Masked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language GenerationMasked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language Generation
Hoon Heo
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례학현 김
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례학현 김
 
Character-Aware Neural Language Models
Character-Aware Neural Language ModelsCharacter-Aware Neural Language Models
Character-Aware Neural Language Models
Hoon Heo
 
iT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python OverviewiT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python Overview
Dongmin Kim
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례학현 김
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14
진화 손
 

What's hot (17)

Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림Dx관련 alignment 정리 by 은자림
Dx관련 alignment 정리 by 은자림
 
Efficient Training of Bert by Progressively Stacking
Efficient Training of Bert by Progressively StackingEfficient Training of Bert by Progressively Stacking
Efficient Training of Bert by Progressively Stacking
 
REALM
REALMREALM
REALM
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1
 
2017 tensor flow dev summit
2017 tensor flow dev summit2017 tensor flow dev summit
2017 tensor flow dev summit
 
15.ai term project_final
15.ai term project_final15.ai term project_final
15.ai term project_final
 
TinyBERT
TinyBERTTinyBERT
TinyBERT
 
Masked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language GenerationMasked Sequence to Sequence Pre-training for Language Generation
Masked Sequence to Sequence Pre-training for Language Generation
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
 
Character-Aware Neural Language Models
Character-Aware Neural Language ModelsCharacter-Aware Neural Language Models
Character-Aware Neural Language Models
 
iT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python OverviewiT Cafe - Linear Algebra & Python Overview
iT Cafe - Linear Algebra & Python Overview
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
 
Effective modern cpp item14
Effective modern cpp item14Effective modern cpp item14
Effective modern cpp item14
 

Similar to [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산

자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
라한사 아
 
Machine translation survey vol2
Machine translation survey   vol2Machine translation survey   vol2
Machine translation survey vol2
gohyunwoong
 
Template at c++
Template at c++Template at c++
Template at c++
Lusain Kim
 
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
ultrasuperrok
 
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
ultrasuperrok
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
Lee Seungeun
 
병렬 프로그래밍2
병렬 프로그래밍2병렬 프로그래밍2
병렬 프로그래밍2
준혁 이
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
ultrasuperrok
 
PaLM Paper Review
PaLM Paper ReviewPaLM Paper Review
PaLM Paper Review
Tae Young Lee
 
R2서버정진욱
R2서버정진욱R2서버정진욱
R2서버정진욱jungjinwouk
 
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
ultrasuperrok
 
2021-11-16 모두콘 딥러닝 경량화 발표
2021-11-16 모두콘 딥러닝 경량화 발표2021-11-16 모두콘 딥러닝 경량화 발표
2021-11-16 모두콘 딥러닝 경량화 발표
JongkukLim
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT
Tae Young Lee
 
딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)
Tae Young Lee
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서KimChangHoen
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
Gruter
 
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
Lablup Inc.
 

Similar to [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 (20)

자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
Machine translation survey vol2
Machine translation survey   vol2Machine translation survey   vol2
Machine translation survey vol2
 
Template at c++
Template at c++Template at c++
Template at c++
 
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
 
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
 
병렬 프로그래밍2
병렬 프로그래밍2병렬 프로그래밍2
병렬 프로그래밍2
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
코딩테스트 합격자 되기 C++ 03장 시간 복잡도에 대한 강의를 진행했습니다.
 
PaLM Paper Review
PaLM Paper ReviewPaLM Paper Review
PaLM Paper Review
 
R2서버정진욱
R2서버정진욱R2서버정진욱
R2서버정진욱
 
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
코딩테스트 합격자 되기 C++ 03장(시간 복잡도)를 설명한 ppt입니다
 
2021-11-16 모두콘 딥러닝 경량화 발표
2021-11-16 모두콘 딥러닝 경량화 발표2021-11-16 모두콘 딥러닝 경량화 발표
2021-11-16 모두콘 딥러닝 경량화 발표
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT
 
딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)딥러닝을 위한 Tensor flow(skt academy)
딥러닝을 위한 Tensor flow(skt academy)
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
 
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
JMI Techtalk: 강재욱 - Toward tf.keras from tf.estimator - From TensorFlow 2.0 p...
 

More from Sehyeon Nam

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17Sehyeon Nam
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11Sehyeon Nam
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11
Sehyeon Nam
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
Sehyeon Nam
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
Sehyeon Nam
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
Sehyeon Nam
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
Sehyeon Nam
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
Sehyeon Nam
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
Sehyeon Nam
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
Sehyeon Nam
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
Sehyeon Nam
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
Sehyeon Nam
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmarySehyeon Nam
 
D2 ppt
D2 pptD2 ppt
D2 ppt
Sehyeon Nam
 

More from Sehyeon Nam (15)

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
 
D2 ppt
D2 pptD2 ppt
D2 ppt
 

[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산

  • 1. 1부 프로그래밍 기법들 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 Page 59 ~ 77 NHN NEXT, NEXON 라태웅
  • 2. 서론 C++ 프로그래머라면 템플릿이라는 말에서 STL, 범용 컨테이너 등을 떠올릴 것 템플릿은 속도와 크기 모두에서 대단히 최적화된 코드를 만들어 내는 하나의 가 상 컴파일러가 될 수 있음 Todd Veldhuidzen과 David Vandevoorde가 어떠한 알고리즘도 템플릿화 될 수 있 음을 보임 이 챕터에서는 몇 가지 예제로 템플릿의 새로운 활용 방법에 대해 알아볼 것
  • 3. 피보나치 수열 - 정의 피보나치 수열 : 0, 1, 1, 2, 3, 5, 8, 13, … 형태의 수열 일반화된 공식 : Fib(n) = Fib(n-1) + Fib(n-2)
  • 4. 피보나치 수열 – 재귀 호출 방식 일반적인 재귀 호출 방식 피보나치 수열 함수
  • 5. 피보나치 수열 – 문제 간결하고 보기 쉬운 코드지만 수행 시간이 n에 지수적으로 증가 따라서 게임에서 이런 코드를 실행시키는 것은 금물 이를 템플릿화한다.
  • 6. 피보나치 수열 – 템플릿 방식
  • 7. 피보나치 수열 – 주의할 점 템플릿 함수는 실제 함수가 아님. Val이라는 열거형 정수일 뿐 struct으로 정의한 것은 표기를 단수화하기 위한 것일 뿐 템플릿 인자 N은 함수의 입력을 지정하는 용도로 쓰임. 재귀 순환을 종료하기 위한 상태를 처리해야 함. (피보나치 수열의 경우 N이 0이 나 1일 때 종료됨)
  • 8. 피보나치 수열 – 컴파일 과정 FibT(4) 컴파일 과정 Fib<4>::Val = Fib<3>::Val + Fib<2>::Val = Fib<2>::Val + Fib<1>::Val + Fib<1>::Val + Fib<0>::Val = Fib<1>::Val + Fib<0>::Val + 1 + 1 + 0 = 1 + 0 + 1 + 1 + 0 = 3
  • 9. 피보나치 수열 – 컴파일 과정 모든 입력이 컴파일 시점에서 결정 따라서 FibT(N)은 컴파일이 끝나면 하나의 상수가 됨 즉, 위의 코드에서 FibT(4)는 3으로 치환 됨.
  • 10. 피보나치 수열 – 혁신 알고리즘의 최적화만으로 지수적인 수행 시간을 런타임에서 상수적인 수행 시 간으로 줄일 수 있음 컴파일에 걸리는 시간이 늘어나겠지만, 실제 실행 속도는 매우 빨라짐.
  • 11. 계승(Factorial) - 정의 계승(Factorial) : N!으로 표현하며 1*2*3*…*(N-1)*N을 의미 이를 재귀 호출로 구하고, 템플릿 메타프로그래밍 버전으로 바꿔보자.
  • 14. 계승(Factorial) - 템플릿화 피보나치 예제와 마찬가지로 FactT(4)는 상수 24가 됨 즉, n에 비례하는 수행 시간이 런타임에서는 상수적인 수행 시간(O(1))으로 줄어 드는 것
  • 15. 계승(Factorial) - 단점 가독성 FactT(n)과 같은 잘 정의된 매크로를 사용하면 해결 컴파일 시간 감수할 수 있음 (한 번만 컴파일하니까?) 피보나치 수열이나 계승이 필요한 게임은 많지 않음 필요로 하더라도 컴파일 시점에서 결정할 수 있는 경우는 드뭄 게임에서 거의 필수적으로 쓰이는 삼각함수를 템플릿화 해보자
  • 16. 삼각함수 템플릿 기법이 실제로 쓸모 있는 것임을 보여주는 예가 될 것 많은 게임들이 sine 값 테이블이나 비슷한 방식을 이용해서 계산 속도를 높이는 기법을 사용함 만약 컴파일러가 sine(1.234) 같은 코드를 읽고 이로부터 단 하나의 move 명령을 생성해낼 수 있다면? 즉, sine(1.234)가 상수로 치환된다면? -> 수행 속도 매우 빨라질 것
  • 17. 삼각함수 sine(x)은 으로 계산됨 위의 식에서 x는 라디안 값이고 0 <= x < 2pie 임 이를 재귀적으로 표현하면,
  • 18. 삼각함수 – 재귀 호출 방식
  • 21. 삼각함수 – 템플릿화 !!?? 왜 안돼는거야!? 하고 찾아봤더니… 즉, float, double 같은 부동소수점은 사용할 수 없다!!
  • 22. 삼각함수 – 템플릿화 하지만 이대로 포기할 수 없음 정수 계산을 하고 부동소수점으로 변환하도록 해보자.
  • 23. 삼각함수 – 템플릿화 1.234의 경우 1234와 1000을 넣음 단점 매번 R/D를 수행해야함 개선 정수로 계산을 하고 return을 할 때만 D로 나눠주는 방식으로 개선할 수 있음
  • 24. 결론 책에서는 템플릿 메타프로그래밍이 런타임에서 계산하는 것보다 느릴 때도 있 지만 결론은 짱짱맨 컴파일러마다 템플릿 처리 방식이 약간 다르고 재귀적인 호출 회수를 컴파일 중 에 제한하는 경우도 있음 아무튼 템플릿 짱짱맨
  • 25. 발표자 결론 그러나 삼각함수의 예처럼 2000년도에는 되던 방법이 2014년에는 안되는 경우 가 많음… 분명 제대로 공부하고 알고 사용하면 유용할 것 같음 차라리 미리 계산해두고 상수 값으로 쓰면 컴파일 시간도 아끼고 런타임 시간도 아낄 수 있을텐데 굳이 템플릿 메타프로그래밍으로 해야할 필요가 있나?
  • 26. 발표를 마치며… 템플릿 메타프로그래밍에 깊이가 없다보니 이게 현업에서 큰 도움이 될지는 잘 모르겠음 코드 가독성이 떨어지고 컴파일 시간이 늘어나고 상수 값만 넣을 수 있으니 동적 으로 무언가 계산할 수도 없고 불편한 점이 더 많아보임 정말 이걸 쓸 날이 올까..?
  • 27. ‘ GPG를 공부하자’ 페이스북 페이지 https://www.facebook.com/gpgstudygogo