SlideShare une entreprise Scribd logo
1  sur  27
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

Contenu connexe

Tendances

성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
학현 김
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1
학현 김
 
성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1성공적인 프로세스 개선 사례 1
성공적인 프로세스 개선 사례 1
학현 김
 
15.ai term project_final
15.ai term project_final15.ai term project_final
15.ai term project_final
호상 장
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
학현 김
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
학현 김
 
성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례성공적인 프로세스 개선 사례
성공적인 프로세스 개선 사례
학현 김
 

Tendances (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
 

Similaire à GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산

이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
익성 조
 
R2서버정진욱
R2서버정진욱R2서버정진욱
R2서버정진욱
jungjinwouk
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
KimChangHoen
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
KTH
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
KTH, 케이티하이텔
 

Similaire à 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장을 정리한 강의자료 입니다.
코딩 테스트 합격자 되기 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)
 
PaLM Paper Review
PaLM Paper ReviewPaLM Paper Review
PaLM Paper Review
 
R2서버정진욱
R2서버정진욱R2서버정진욱
R2서버정진욱
 
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...
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
 

Plus de Taeung Ra (6)

GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법
 
1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법
 
Super Meat Boy 포스트모템
Super Meat Boy 포스트모템Super Meat Boy 포스트모템
Super Meat Boy 포스트모템
 
Nhn next this plus technical report
Nhn next this plus technical reportNhn next this plus technical report
Nhn next this plus technical report
 
행렬
행렬행렬
행렬
 
인디 소프트웨어 개발기
인디 소프트웨어 개발기인디 소프트웨어 개발기
인디 소프트웨어 개발기
 

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