런타임 가변 다차원 배열과 뷰 구현
Marray는 C++98·C++0x 환경에서 차원을 실행 시점에 자유롭게 바꿀 수 있는 다차원 배열과 뷰를 제공하는 템플릿 라이브러리이다. 뷰 개념을 도입해 메모리 복사 없이 부분 배열을 다루며, R·MATLAB 같은 스크립트 언어의 유연성을 C++에 가져온다. 오픈소스로 배포돼 상업·비상업 모두 무료이다.
초록
Marray는 C++98·C++0x 환경에서 차원을 실행 시점에 자유롭게 바꿀 수 있는 다차원 배열과 뷰를 제공하는 템플릿 라이브러리이다. 뷰 개념을 도입해 메모리 복사 없이 부분 배열을 다루며, R·MATLAB 같은 스크립트 언어의 유연성을 C++에 가져온다. 오픈소스로 배포돼 상업·비상업 모두 무료이다.
상세 요약
본 논문은 C++에서 차원 고정 배열을 지원하는 템플릿 라이브러리(예: Boost.MultiArray, Blitz++)와 달리, 실행 시점에 차원을 변경할 수 있는 일반화된 구조를 제시한다. 핵심 아이디어는 “뷰(view)”라는 추상화이다. 뷰는 원본 데이터에 대한 메타데이터(차원 수, 각 차원의 크기, 스트라이드, 오프셋)를 보관하고, 실제 데이터는 복사하지 않는다. 이를 통해 서브 배열, 전치, 슬라이스, 리쉐이프와 같은 연산을 O(1) 시간에 수행할 수 있다.
Marray는 두 종류의 기본 클래스인 marray와 view로 구성된다. marray는 연속 메모리 블록을 소유하며, 동적 할당과 해제를 담당한다. view는 marray 혹은 다른 view를 참조해 계층적인 뷰 체인을 만든다. 각 클래스는 템플릿 파라미터로 요소 타입과 인덱스 타입을 받으며, C++98에서도 사용할 수 있도록 템플릿 메타프로그래밍을 최소화했다. C++0x(현재는 C++11)에서는 rvalue reference와 move semantics를 활용해 복사 비용을 더욱 줄였다.
스트라이드 계산은 차원마다 독립적으로 정의된다. 기본적으로는 행 우선(row‑major) 레이아웃을 따르지만, 사용자는 열 우선(column‑major)이나 사용자 정의 스트라이드도 지정할 수 있다. 뷰 생성 시 기존 스트라이드와 오프셋을 재조정해 새로운 차원 정보를 만든다. 예를 들어, 3차원 배열에 대해 slice(1, 2)를 호출하면 두 번째 차원의 인덱스 2를 고정한 2차원 뷰가 반환된다. 이때 메모리 복사는 일어나지 않으며, 오프셋만 변경된다.
성능 평가에서는 Marray가 기존 C 배열, Boost.MultiArray, 그리고 C 구현의 런타임 가변 배열과 비교되었다. 순차 접근 시에는 원본 데이터와 동일한 연속 메모리 구조를 유지하므로 캐시 효율이 높다. 뷰 연산은 메타데이터만 수정하므로 오버헤드가 거의 없으며, 복잡한 연산(전치·리쉐이프·슬라이스)에서도 평균 5~10% 정도의 시간 절감 효과를 보였다.
또한, Marray는 STL 스타일의 반복자와 `operator
📜 논문 원문 (영문)
🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...