게임 Lobsters · 6일 전

4KB 캐시에 영혼까지 갈아넣은 플레이데이트 초절정 최적화 비법

핵심 요약
  • 한 개발자가 플레이데이트 콘솔에서 풀스피드 게임보이 에뮬레이터를 구동하기 위해 발견한 C 언어 저수준 최적화 비법을 공개했습니다.
  • 4KB에 불과한 명령어 캐시에 코드를 집어넣기 위해 20KB짜리 핵심 코드를 2KB로 압축하고 컴파일러 옵션(-Os)을 바꾼 결과 오히려 성능이 극대화되었습니다.
  • 초고속 메모리(DTCM)를 쓰기 위해 스택 하단 영역의 주소를 강제로 계산해 데이터를 영구 상주시키는 기상천외한 메모리 꼼수까지 동원했습니다.
요약 휴대용 미니 콘솔 '플레이데이트(Playdate)'에서 게임보이 에뮬레이터를 구동하려던 한 개발자가 극한의 성능을 뽑아내기 위해 적용한 독특한 저수준 C 언어 최적화 비법을 공유해 화제가 되고 있습니다. 글쓴이에 따르면 플레이데이트의 CPU는 연산 속도 자체는 빠르지만 캐시 외부 메모리 접근 속도가 현저히 느린 특성을 가지고 있습니다. 이 때문에 레지스터를 적극 활용하고 메모리 로드를 최소화하는 코드가 훨씬 유리한 환경입니다. 가장 결정적인 병목은 턱없이 작은 명령어 캐시(I-Cache)였습니다. 초기 리비전(Rev A) 모델의 명령어 캐시는 고작 4KB에 불과해, 일반적인 최적화 옵션(-O3)으로 코드가 비대해지면 성능이 급격히 저하되는 문제가 발생했습니다. 이에 개발자는 거대한 switch-case 테이블을 걷어내고 분기를 단순화하여 20KB에 달하던 에뮬레이터 핵심 루프 코드를 2KB 크기로 압축하고 코드 크기 최적화 옵션(-Os)을 적용했습니다. 연산 단계가 다소 늘어나더라도 코드가 캐시 안에 전부 들어가도록 만들자 처리 속도가 비약적으로 향상되었습니다. 여기에 링커 스크립트를 커스텀하여 핵심 함수들을 메모리상에 연속으로 배치하고, 자주 쓰이지 않는 예외 코드들은 캐시 밖으로 밀어내는 작업도 병행했습니다. 메모리 접근 속도를 끌어올리기 위한 기상천외한 꼼수도 소개되었습니다. 플레이데이트 내부의 초고속 메모리 영역인 DTCM(Tightly-Coupled Memory)에 스택이 위치한다는 점에 착안해, 힙에 둔 구조체를 임시로 스택에 복사(memcpy)해 처리한 뒤 돌려놓는 방식을 넘어 아예 스택 하단에 데이터를 영구 상주시키는 방식을 고안한 것입니다. 메인 함수를 제어할 수 없는 환경을 우회하기 위해 빌트인 함수로 스택 시작 주소를 구한 뒤, 오버플로 위험이 없는 안전 거리를 빼서 일종의 메모리 풀을 강제로 확보하고 카나리(canary) 값을 심어 충돌을 감시하는 극한의 테크닉까지 동원했습니다. 개발자는 에뮬레이터나 대형 시뮬레이션, 3D 렌더러 등 극한의 연산 효율이 필요한 프로젝트에 유용할 것이라고 전했습니다.
Sponsored · 광고