27
1부 부부부부부 부부부 1.2 부부부 부부부부부부부부 부부부 부부 부부 부부 Page 59 ~ 77 NHN NEXT, NEXON 부부부

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

Embed Size (px)

DESCRIPTION

NHN NEXT, NEXON의 라태웅의 발표입니다. C++의 템플릿을 이용한 템플릿 메타 프로그래밍! 여러분들도 우리 스터디 참여하셔서 Live로 들으시고 발표도 하러 오세요! 관련 문의 : 댓글 or https://www.facebook.com/gpgstudygogo

Citation preview

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

1 부프로그래밍 기법들1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산Page 59 ~ 77NHN NEXT, NEXON 라태웅

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

서론 C++ 프로그래머라면 템플릿이라는 말에서 STL, 범용 컨테이너 등을 떠올릴 것

템플릿은 속도와 크기 모두에서 대단히 최적화된 코드를 만들어 내는 하나의 가상 컴파일러가 될 수 있음

Todd Veldhuidzen 과 David Vandevoorde 가 어떠한 알고리즘도 템플릿화 될 수 있음을 보임

이 챕터에서는 몇 가지 예제로 템플릿의 새로운 활용 방법에 대해 알아볼 것

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

피보나치 수열 - 정의 피보나치 수열 : 0, 1, 1, 2, 3, 5, 8, 13, … 형태의 수열 일반화된 공식 : Fib(n) = Fib(n-1) + Fib(n-2)

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

피보나치 수열 – 재귀 호출 방식 일반적인 재귀 호출 방식 피보나치 수열 함수

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

피보나치 수열 – 문제 간결하고 보기 쉬운 코드지만 수행 시간이 n 에 지수적으로 증가 따라서 게임에서 이런 코드를 실행시키는 것은 금물

이를 템플릿화한다 .

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

피보나치 수열 – 템플릿 방식

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

피보나치 수열 – 주의할 점 템플릿 함수는 실제 함수가 아님 . Val 이라는 열거형 정수일 뿐

struct 으로 정의한 것은 표기를 단수화하기 위한 것일 뿐

템플릿 인자 N 은 함수의 입력을 지정하는 용도로 쓰임 .

재귀 순환을 종료하기 위한 상태를 처리해야 함 . ( 피보나치 수열의 경우 N 이 0이나 1 일 때 종료됨 )

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

피보나치 수열 – 컴파일 과정 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

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

피보나치 수열 – 컴파일 과정 모든 입력이 컴파일 시점에서 결정 따라서 FibT(N) 은 컴파일이 끝나면 하나의 상수가 됨

즉 ,

위의 코드에서 FibT(4) 는 3 으로 치환 됨 .

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

피보나치 수열 – 혁신 알고리즘의 최적화만으로 지수적인 수행 시간을 런타임에서 상수적인 수행 시간으로 줄일 수 있음

컴파일에 걸리는 시간이 늘어나겠지만 , 실제 실행 속도는 매우 빨라짐 .

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

계승 (Factorial) - 정의 계승 (Factorial) : N! 으로 표현하며 1*2*3*…*(N-1)*N 을 의미

이를 재귀 호출로 구하고 , 템플릿 메타프로그래밍 버전으로 바꿔보자 .

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

계승 (Factorial) – 재귀 호출 방식

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

계승 (Factorial) – 템플릿화

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

계승 (Factorial) - 템플릿화 피보나치 예제와 마찬가지로 FactT(4) 는 상수 24 가 됨 즉 , n 에 비례하는 수행 시간이 런타임에서는 상수적인 수행 시간 (O(1)) 으로 줄어드는 것

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

계승 (Factorial) - 단점 가독성 FactT(n) 과 같은 잘 정의된 매크로를 사용하면 해결 컴파일 시간 감수할 수 있음 ( 한 번만 컴파일하니까 ?)

피보나치 수열이나 계승이 필요한 게임은 많지 않음 필요로 하더라도 컴파일 시점에서 결정할 수 있는 경우는 드뭄 게임에서 거의 필수적으로 쓰이는 삼각함수를 템플릿화 해보자

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

삼각함수 템플릿 기법이 실제로 쓸모 있는 것임을 보여주는 예가 될 것 많은 게임들이 sine 값 테이블이나 비슷한 방식을 이용해서 계산 속도를 높이는 기법을 사용함

만약 컴파일러가 sine(1.234) 같은 코드를 읽고 이로부터 단 하나의 move 명령을 생성해낼 수 있다면 ?

즉 , sine(1.234) 가 상수로 치환된다면 ? -> 수행 속도 매우 빨라질 것

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

삼각함수 sine(x) 은 으로 계산됨 위의 식에서 x 는 라디안 값이고 0 <= x < 2pie 임 이를 재귀적으로 표현하면 ,

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

삼각함수 – 재귀 호출 방식

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

삼각함수 – 템플릿화

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

삼각함수 – 템플릿화

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

삼각함수 – 템플릿화 !!?? 왜 안돼는거야 !? 하고 찾아봤더니… 즉 , float, double 같은 부동소수점은 사용할 수 없다 !!

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

삼각함수 – 템플릿화 하지만 이대로 포기할 수 없음 정수 계산을 하고 부동소수점으로 변환하도록 해보자 .

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

삼각함수 – 템플릿화 1.234 의 경우 1234 와 1000 을 넣음 단점 매번 R/D 를 수행해야함 개선 정수로 계산을 하고 return 을 할 때만 D 로 나눠주는 방식으로 개선할 수 있음

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

결론 책에서는 템플릿 메타프로그래밍이 런타임에서 계산하는 것보다 느릴 때도 있지만 결론은 짱짱맨

컴파일러마다 템플릿 처리 방식이 약간 다르고 재귀적인 호출 회수를 컴파일 중에 제한하는 경우도 있음

아무튼 템플릿 짱짱맨

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

발표자 결론 그러나 삼각함수의 예처럼 2000 년도에는 되던 방법이 2014 년에는 안되는 경우가 많음…

분명 제대로 공부하고 알고 사용하면 유용할 것 같음

차라리 미리 계산해두고 상수 값으로 쓰면 컴파일 시간도 아끼고 런타임 시간도 아낄 수 있을텐데 굳이 템플릿 메타프로그래밍으로 해야할 필요가 있나 ?

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

발표를 마치며…템플릿 메타프로그래밍에 깊이가 없다보니 이게 현업에서 큰 도움이 될지는 잘 모르겠음

코드 가독성이 떨어지고 컴파일 시간이 늘어나고 상수 값만 넣을 수 있으니 동적으로 무언가 계산할 수도 없고 불편한 점이 더 많아보임

정말 이걸 쓸 날이 올까 ..?

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

‘ GPG 를 공부하자’ 페이스북 페이지

https://www.facebook.com/gpgstudygogo