C/C++ asin() 함수, Estrin's Scheme 적용으로 최대 1.88배 성능 향상!
C/C++ asin() 함수의 Estrin's Scheme 적용을 통해 Instruction-level parallelism을 활용, 성능을 개선함
Intel i7, AMD Ryzen, Apple M4 등 다양한 환경에서 벤치마크(Benchmark)를 수행하여 성능 향상 확인
레이 트레이서(Ray Tracer)에 적용하여 3%의 렌더링 속도 향상을 달성함
LUT(Look-Up Table) 방식 대신 수학 공식을 사용하고, SIMD(Single Instruction, Multiple Data) 최적화는 아키텍처 제약으로 보류함
Estrin's Scheme을 활용한 asin() 함수 최적화
저자는 Cg의 asin() 근사 함수를 Estrin's Scheme을 사용하여 최적화했다. 기술적으로 보면, 기존 Horner's method를 Estrin's Scheme으로 재작성하여 Instruction-level parallelism을 가능하게 했다. 이를 통해 컴파일러와 CPU가 독립적으로 연산을 수행하도록 하여, 의존성 체인(Dependency Chain) 길이를 줄였다. 결과적으로, Intel i7 환경에서 최대 1.80배의 성능 향상을 달성했다.
다양한 환경에서의 벤치마크 결과 분석
벤치마크 결과에 따르면, Intel i7, AMD Ryzen 9, Apple M4 등 다양한 CPU 아키텍처와 GCC, Clang, MSVC 등 다양한 컴파일러 환경에서 성능 변화가 관찰되었다. 특히, Intel i7에서는 최대 1.88배의 성능 향상이 있었지만, AMD Ryzen 9에서는 미미한 개선만 있었다. Apple M4에서는 Clang 컴파일러 사용 시에만 성능 향상이 나타났다. 이러한 결과는 컴파일러 최적화(Compiler Optimization)와 CPU 아키텍처의 특성에 따라 성능 차이가 발생할 수 있음을 시사한다.
레이 트레이서(Ray Tracer)에 적용한 성능 개선
최적화된 asin() 함수를 레이 트레이서에 적용한 결과, 3%의 렌더링 속도 향상을 얻었다. 이는 asin() 함수가 전체 프로그램에서 차지하는 비중이 작기 때문으로 분석된다. 저자는 LUT(Look-Up Table) 방식 대신 수학 공식을 사용했는데, LUT 방식은 과거에는 더 빠를 수 있었지만, 현재는 더 많은 오차를 발생시킨다는 점을 고려했다. 또한, PSRayTracing 아키텍처의 제약으로 인해 SIMD(Single Instruction, Multiple Data) 최적화는 적용하지 못했다.
최적화 과정에서의 트레이드오프 및 고려 사항
저자는 asin() 함수 최적화 과정에서 수치적 정확성(Numerical Accuracy)과 성능 사이의 트레이드오프를 고려했다. 또한, SIMD 최적화 대신 Estrin's Scheme을 선택한 것은 기존 코드 아키텍처의 제약 때문이다. 저자는 벤치마킹의 중요성을 강조하며, 문제 해결을 위해 다양한 방법을 시도하고, 결과를 측정(Measurement)하는 과정을 거쳐야 한다고 강조했다. 이는 성능 최적화 과정에서 일반적인 접근 방식과는 차별화되는 부분이다.