C++11 기반 다차원 텐서 고성능 구현

C++11 기반 다차원 텐서 고성능 구현

초록

본 논문은 C++11의 최신 문법과 템플릿 메타프로그래밍을 활용해, 단일 Array 클래스 템플릿으로 任意 차원의 텐서를 효율적으로 구현하는 방법을 제시한다. 표현식 템플릿을 도입해 수학적 연산을 직관적인 구문으로 작성하면서도 런타임 오버헤드를 최소화하고, CPU와 GPU 양쪽에서 벤치마크 테스트를 수행해 성능을 검증한다.

상세 분석

논문은 먼저 C++11이 제공하는 가변 템플릿 인자(pack), constexpr, auto, decltype, 람다식 등을 활용해 텐서의 차원과 크기를 컴파일 타임에 결정하도록 설계하였다. 핵심은 Array<T, N> 형태의 클래스 템플릿으로, 여기서 T는 원소 타입, N은 차원 수를 의미한다. 차원별 크기는 std::array<std::size_t, N> 로 저장되며, 인덱싱 연산은 재귀적인 operator() 오버로드를 통해 구현된다. 이때 static_assert 로 차원 불일치를 컴파일 단계에서 차단함으로써 안전성을 높였다.

표현식 템플릿은 TensorExpr 라는 추상 베이스와 TensorAdd, TensorMul 등 구체 파생 클래스로 구성된다. 연산자는 템플릿 함수 operator+, operator* 등을 오버로드해 임시 객체 생성을 피하고, 연산식 자체를 트리 구조로 보관한다. 최종 평가 시 eval() 메서드가 호출되면, 루프 전개와 SIMD 친화적인 메모리 접근이 자동으로 적용되어, 기존 루프 기반 구현과 동일하거나 더 나은 성능을 달성한다.

GPU 지원은 CUDA와의 연동을 고려해, Array 내부에 device_ptr 를 조건부로 포함하고, __host__ __device__ 특성을 이용해 동일 코드를 CPU와 GPU 양쪽에서 컴파일한다. 메모리 전송은 텐서 전체를 한 번에 복사하는 copy_to_devicecopy_to_host 로 추상화했으며, 이는 사용자가 명시적으로 관리할 필요 없이 자동화된다.

성능 평가에서는 BLAS와 cuBLAS와 같은 최적화 라이브러리와 비교했을 때, 차원 2(행렬)와 차원 3 이상의 텐서 연산에서 10~30% 정도의 오버헤드 감소를 보였다. 특히, 표현식 템플릿을 이용한 복합 연산(예: C = A*B + D)에서 중간 결과를 메모리에 저장하지 않아 메모리 대역폭 압박을 크게 완화하였다.

전체 설계는 템플릿 메타프로그래밍을 과도하게 복잡하게 만들지 않으면서도, 사용자는 Array<double,3> A({4,5,6}); 와 같이 직관적으로 텐서를 선언하고, auto E = A + B * C; 형태로 수식 작성을 할 수 있게 한다. 이는 고성능 컴퓨팅 분야에서 수학적 모델링과 코드 유지보수를 동시에 만족시키는 실용적인 접근법이라 할 수 있다.