고성능 2D 그래픽을 CPU에서 구현하기 위한 희소 스트립 기반 렌더링 [pdf]
(github.com/LaurenzV)- CPU 기반 2D 그래픽 렌더링에서 효율을 높이기 위해 희소 스트립(sparse strips) 구조를 활용한 접근법 제시
- GPU 대신 CPU에서 고성능 렌더링을 실현하기 위한 데이터 구조와 처리 방식 중심의 연구
- 희소 데이터 표현을 통해 메모리 사용량을 줄이고, 복잡한 장면에서도 빠른 렌더링 속도 확보
- 기존 CPU 렌더링 방식 대비 병렬 처리 효율과 캐시 활용성을 개선한 설계
- CPU만으로도 고품질 2D 그래픽을 구현할 수 있는 가능성을 보여주는 연구
연구 개요
- 본 논문은 CPU에서의 고성능 2D 그래픽 렌더링을 목표로 하며, GPU 의존도를 낮추는 방법을 탐구
- 핵심 개념은 희소 스트립(sparse strips) 이라는 데이터 구조로, 픽셀 단위의 연속적 데이터 대신 필요한 부분만 효율적으로 저장
- 이 구조를 통해 메모리 접근 비용 감소와 렌더링 속도 향상을 달성
희소 스트립 구조
- 스트립(strip) 은 2D 이미지의 연속된 픽셀 구간을 나타내며, 희소(sparse) 형태로 필요한 부분만 저장
- 이 방식은 빈 공간이 많은 이미지나 복잡한 벡터 그래픽에서 특히 효율적
- 기존의 전체 버퍼 기반 렌더링보다 메모리 사용량 절감과 캐시 효율성 향상을 제공
성능 및 구현
- CPU의 SIMD 명령어와 멀티스레딩을 활용해 병렬 처리 성능을 극대화
- 실험 결과, 동일한 장면을 GPU 없이도 실시간 렌더링 수준의 성능으로 처리 가능
- 구현은 C++ 기반으로 작성되었으며, 다양한 해상도와 장면 복잡도에서 테스트 수행
응용 가능성
- UI 렌더링, 벡터 그래픽 엔진, 게임 엔진의 2D 파이프라인 등 CPU 중심 환경에서 활용 가능
- GPU가 제한된 임베디드 시스템이나 서버 환경에서도 고성능 2D 그래픽 처리를 지원할 수 있음
결론
- 희소 스트립 기반 접근은 CPU 렌더링의 병목 현상 완화와 메모리 효율성 향상을 입증
- GPU 의존적 그래픽 처리 구조에 대한 대안적 모델로서의 가능성 제시
- 원문에 추가적인 수치나 비교 데이터는 PDF 본문에서 확인 필요
Hacker News 의견
-
논문에서 정의한
struct Strip구조체가 64 비트(8바이트) 크기처럼 보이는데, 본문에서는 한 스트립이 64 바이트라고 되어 있음
계산해보면 실제로는 259×8 + 7296 ≈ 9KB 정도로 보임. 뭔가 단위가 잘못된 것 같음- 작성자임. 맞음, 비트와 바이트를 혼동한 실수였음. 지적해줘서 고맙게 생각함
- 코드 전체를 살펴볼 시간은 없지만, 논문을 보면 멀티스레딩 관련 섹션이 있음
단순한 오타일 수도 있지만, 각 스트립을 캐시 라인(64바이트) 단위로 할당했을 가능성도 있음.
이렇게 하면 false sharing을 피할 수 있어서, 렌더러가 일부러 그렇게 했을 수도 있음 - 나도 같은 생각임. 해당 문단에서 메모리 사용량이 과대평가된 것 같음.
논문에서는 주로 실행 시간 비교에 초점을 맞췄고, 저장 공간 비교는 다루지 않았음
-
Blaze: Parallel Rasterization on CPU도 함께 보면 좋음
- 좋은 정보 고마움. 이 프로젝트는 몰랐는데, 벤치마크 수치가 꽤 인상적임
- 데모가 정말 놀라울 정도로 빠름
-
프로젝트가 흥미로움. 3.9절을 보면 출력이 비트맵 형태라서, 결국 GPU로 이미지를 복사해야 할 것 같음
Skia가 WebGPU로 이동하고 있고, WebGPU가 compute shader를 지원하니 2D 그래픽은 점점 이식성과 성능 면에서 해결된 문제로 보임
다만 CPU 렌더러가 여전히 유용한 경우도 있음 — 예를 들어 웹 환경에서는 페이지 로드 시 셰이더를 런타임에 컴파일해야 하므로
이론적으로는 JS JIT처럼 CPU 렌더러로 시작하고 GPU 셰이더가 준비되면 전환하는 구조도 가능할 듯함
또 하나의 장점은 바이너리 크기가 작다는 점임. WebGPU(dawn 기반)는 꽤 큼
참고 링크- 맞음, 출력은 비트맵이라 GPU로 업로드해야 함.
더 큰 프로젝트에서는 Vello Hybrid라는 버전도 있는데, CPU에서 기하 연산을 하고 GPU에서 픽셀 페인팅을 처리함
CPU 렌더러를 셰이더 컴파일 중에 사용하는 아이디어도 고려했지만 아직 구현하진 않았음 - CPU 렌더러가 특히 유용한 곳은 테스트 러너임. 출력이 이미지나 스크린샷일 때 GPU로 복사할 필요가 없음
오히려 GPU에서 렌더링하면 다시 이미지를 복사해야 하므로 비효율적임 - 통합 메모리 아키텍처(예: Apple Silicon)에서는 GPU로 복사할 필요가 없음. 같은 메모리를 공유하므로 비용이 거의 없음
- 맞음, 출력은 비트맵이라 GPU로 업로드해야 함.
-
최근 수백만 개의 정점을 가진 고정밀 N-body 궤적을 렌더링하는 코드를 작성했는데,
이 논문에서 제안한 RLE 표현을 GPU에서 구현하면 단순함을 유지하면서도 잘 작동할지 궁금함
데모 영상 -
흥미로움. 비교된 렌더러들의 단일 코어 성능을 보고 싶음.
그게 코드 효율성을 보여줄 것 같음. 인기 있는 렌더러들은 속도는 느리지만 CPU 사용량은 적을 수도 있음- 논문에 단일 코어 성능 비교 섹션이 있음
또 Blend2D 공식 벤치마크나
내가 추가 렌더러를 포함해 만든 vello_chart에서도 결과를 볼 수 있음
- 논문에 단일 코어 성능 비교 섹션이 있음
-
혹시 지도교수 중 한 명인 Raph Levien이 예전 Libart 라이브러리의 저자임?
-
약간 주제에서 벗어나지만, GitHub의 PDF 미리보기가 언제부터 일부 페이지만 로드하게 된 건지 궁금함
예전처럼 전체 PDF를 한 번에 불러와서 브라우저가 렌더링하게 하는 게 더 좋을 것 같음 -
렌더러의 정확성(correctness) 을 검증할 수 있는 벤치마크가 있는지 궁금함
- 원래 이런 목적을 위해 Cornell box가 만들어졌음
실제 장면의 라디오시티를 측정해 시뮬레이션 결과와 비교하는 방식임
실시간 렌더링에서는 Arnold나 Octane 같은 오프라인 렌더러를 기준으로 비교하기도 함
Cornell box 위키 - “정확성”이 무엇을 의미하는지에 따라 다름
현실을 완벽히 재현하는 렌더러는 없고, 모두 어느 정도 트레이드오프를 감수함
- 원래 이런 목적을 위해 Cornell box가 만들어졌음