고성능 시스템을 괴롭히는 메모리 벽을 부수는 방법
요약
본 글은 현대 분석 워크로드(analytical workloads)에서 발생하는 '메모리 벽' 문제를 다룹니다. 기존 프로세서는 데이터를 선형적 1차원 배열로 취급하여, 컬럼 기반 데이터의 무작위 접근 시 캐시 일관성 유지에 과부하가 걸립니다. 이를 해결하기 위해 AMD Turin Epyc 9005 아키텍처를 예시로 들며, 하드웨어 레벨에서 데이터를 3차원 기하학적 구조로 보존하는 새로운 방식을 제안합니다.
핵심 포인트
- 기존 프로세서는 메모리를 선형적인 1차원 배열로 취급하여 분석 워크로드에 비효율적입니다.
- 데이터가 공간적으로 상관된 경우, 무작위 접근은 캐시 일관성 요청을 폭증시켜 성능 저하를 유발합니다.
- 새로운 아키텍처는 주소 비트를 인터리빙하여 3차원 구조를 하드웨어 레벨에서 보존하고 데이터 수집 효율성을 높입니다.
일상적인 업무에서 저는 방대한 양의 데이터를 처리하며, 대규모 .parquet 파일, 컬럼 기반 데이터베이스(column-major databases), 그리고 기하학적 또는 행렬 렌즈를 통해 정보를 분석하는 알고리즘들과 씨름합니다.
복잡한 분석 쿼리를 실행하고 다양한 플랫폼에서 무거운 테이블 셔플이나 조인(join)을 수행할 때, 저는 오늘날 가장 진보된 서버 프로세서들이 그들의 최고 이론적 성능에 미치지 못하는 것을 반복적으로 목격합니다. 주범은 무엇일까요? 코어들이 유휴 상태로 남아 RAM으로부터 데이터 전송을 기다리는 것입니다. 우리의 초고속 코어들은 메모리를 경직되고 선형적인 1차원 배열로 보는, 40년 된 아키텍처적 사고방식에 갇혀 있습니다. 반면에 현대 소프트웨어는 관련 영역과 컬럼별로 데이터를 지능적으로 클러스터링하도록 의도적으로 설계됩니다.
128개의 코어가 동시에 현대적인 분석 워크로드(analytical workloads)를 구동할 때, 이 전통적인 메모리 모델은 무너집니다. 코어들은 RAM 공간에 무작위로 흩어진 좁은 64바이트 캐시 라인(cache lines)을 끊임없이 요청합니다. 캐시 일관성(cache coherency)을 유지하여 어떤 코어도 오래된 데이터(stale data)를 처리하지 않도록 보장하기 위해, 프로세서는 내부 상호 연결 패브릭(interconnect fabric)을 수백만 개의 브로드캐스트 스눕 쿼리(broadcast snoop queries)로 범람시키도록 강요받습니다. 시스템은
이러한 비전을 현대 실리콘의 물리적 현실에 정착시키기 위해, 저는 최첨단 서버 프로세서의 토폴로지를 기준 모델이자 구조적 프레임워크로 채택했습니다: 16개의 Core Complex (CCX) 모듈에 대칭적으로 분산된 128개의 고성능 컴퓨팅 코어를 특징으로 하는 AMD "Turin" Epyc 9005 아키텍처입니다. 이 산업 표준을 이론적 수준에서 분석함으로써, 우리는 기존의 틀을 깨고 병렬 컴퓨팅 파워에 3차원 기하학을 접목했을 때 무슨 일이 일어날지 예측할 수 있습니다.
이 접근 방식의 영향을 이해하기 위해, 애플리케이션 데이터를 완전히 풀린 루빅스 큐브라고 상상해 보세요. 각 색깔 면은 테이블의 열(column)이나 날씨 시뮬레이션의 기하학적 차원을 나타냅니다. 소프트웨어에서 이 데이터는 공간적으로 완벽하게 상관되어 있습니다.
하지만 전통적인 프로세서는 이 루빅스 큐브를 RAM에 로드할 때 어떻게 작동할까요? 그것은 구조적으로 선형 사고(linear thinking)에 국한되어 있어 메모리를 단단하고 일차원적인 테이프나 길고 평평한 주소 스트링으로 취급하기 때문에, 큐브 전체를 납작하게 펼쳐서 54개의 모든 색깔 사각형을 하나의 직선으로 배열하도록 강요받습니다.
차원적 평탄화에 대한 실리콘 솔루션
소프트웨어가 그 큐브의 단지 한 면(예: 특정 Parquet 열을 나타내는 파란색 면)만 분석해야 할 때, CPU 코어는 이 거대한 메모리 라인을 따라 무작위로 사냥하며 그 파란색 사각형들을 모아야 합니다. 이 사각형들은 이제 광활한 간격으로 떨어져 있습니다. 이러한 맹목적인 추적은 수백만 개의 브로드캐스트 일관성 요청(
이 아키텍처는 모든 것을 바꿉니다. 칩의 논리 코어 내에서 주소 비트(address bits)를 영리하게 인터리빙(interleaving)함으로써, 하드웨어는 루빅스 큐브의 3차원 형태를 본질적으로 보존하며, 데이터를 수집하는 과정에서도 이를 평평하게 만들지 않습니다. 코어가 파란 면을 요청할 때, 캐시는 전체 3차원 블록을 훨씬 더 효율적으로 가져옵니다. 모든 인접한 파란 사각형들은 이미 물리적으로 그곳에, 단단하게 모여 있습니다.
전통적으로는 단순히 행렬(matrix)을 순회하는 방식을 역전시키는 것만으로도 루프 교환 최적화(loop interchange optimizations)를 통해 상당한 소프트웨어 이득을 얻었습니다. 하지만 저희 아키텍처에서는 이러한 최적화가 네이티브 속성이 되어 실리콘에 직접 새겨집니다. 따라서 소프트웨어는 루프 순서 지정으로 인해 발생하는 성능 비대칭성으로부터 크게 면역됩니다. 데이터를 행(row)으로 탐색하든 열(column)로 탐색하든, 캐시 적중률(cache hit rate)은 일관되게 높고 안정적으로 유지됩니다.
L3 캐시를 하드와이어링된 데이터 구조로 재고하기
실무 엔지니어로서 저는 하드웨어 설계자들이 종종 간과하는 근본적인 진실을 깨닫게 되었습니다. 즉, L3 캐시는 궁극적으로 실리콘에 직접 새겨진 복잡한 데이터 구조의 집합체에 불과하다는 것입니다.
소프트웨어 영역에서 우리는 이미 빅데이터(Big Data)를 처리할 때 거대한 선형 목록을 무작위로 스캔하는 순진한 접근 방식을 포기했습니다. 대신, 최소 및 최대 메타데이터(minimum and maximum metadata)를 활용하여 지리적 인덱스(geometric indices)와 통계적 데이터 건너뛰기 기술(statistical data skipping techniques)에 의존하며, 단 한 번의 바운드(bound)로 기가바이트 단위의 관련 없는 레코드를 우회합니다. 이 아키텍처의 혁신은 이러한 고급 소프트웨어 개념들을 의도적으로 차용하여 L2 및 L3 캐시의 실리콘 구조물에 직접 접목했다는 데서 비롯됩니다.
Z-Order 주소 공간의 핵심 아키텍처 논리
핵심 논지는 컴퓨트 코어(compute cores)가 명령을 실행하는 방식을 재작성하는 것이 아니라, 주소 공간(address space)을 어떻게 구성하느냐에 관한 것입니다. Z-Order 형식 변환은 메모리 관리 장치(Memory Management Unit/TLB) 내부에 내장되어 있으며, 정확히 한 클럭 사이클(1T)의 결정론적 지연 시간 페널티를 발생시킵니다.
이러한 패러다임 하에서 L2 및 L3 캐시는 인터커넥트 패브릭과 함께 Z-Order 레이아웃으로 형식화된 주소만을 독점적으로 사용합니다. 프로세서가 시스템 RAM에 접근할 때마다, 전용 하드웨어 디코더가 Z-Order 주소를 메모리 컨트롤러가 요구하는 표준 물리 메모리 레이아웃으로 다시 변환하며, 이 과정 역시 1T 시간 내에 이루어집니다.
이 Z-Order 기능이 칩 내부에서 정확히 어떻게 작동하는지 파악하려면, 시스템이 생성한 표준 48비트 물리 주소의 비트별 변환 과정을 추적해야 합니다:
오프셋 격리(Offset Isolation): 초기 단계에서 하드웨어는 물리 주소의 낮은 6비트(0-5)를 제거합니다. 이 비트들은 표준 64바이트 캐시 라인 내의 고정된 오프셋을 나타내기 때문에, 변환 논리를 완전히 우회하여 전혀 건드리지 않은 채 유지됩니다.
윈도우 분할(Window Splitting): 나머지 주소 블록(비트 6 이상)으로부터 하드웨어는 크기가 같은 두 개의 창(window)을 잘라냅니다. 하나는 가장 중요한 비트(Most Significant Bits, MSB – 왼쪽 절반)를 포함하고, 다른 하나는 가장 덜 중요한 비트(Least Significant Bits, LSB – 오른쪽 절반)를 포함합니다. 이 두 창은 효과적으로 우리의 가상화된 도메인 내의 공간 좌표 역할을 합니다.
배선 기반 인터리빙(Interleaving via Wiring): MMU 내부의 하드와이어링 로직은 이러한 분할된 비트들을 완벽하게 교차하는 인터리빙 방식(interleaving scheme)을 사용하여 재배열합니다. 오른쪽 창(LSB)에서 파생된 비트들은 새로 생성된 주소의 짝수 위치(0, 2, 4, 6...)에만 독점적으로 매핑되는 반면, 왼쪽 창(MSB)에서 유래한 비트들은 홀수 위치(1, 3, 5, 7. . .)에 매핑됩니다.
공간 지역성 및 마이크로-매크로 캐시 비대칭성
결과적으로 물리적 주소는 Z-Order 레이아웃으로 변환됩니다. 이 이진 배열은 소프트웨어에서 열 방향 또는 행 방향의 이웃이었던 데이터 요소들이 메모리상에 물리적으로 함께 위치하도록 강제하며, 단순한 하드웨어 배선 재배치를 전체 프로세서의 기하학적 엔진으로 변화시킵니다.
이 임계점에서는 선형 주소가 사라지고 캐시 계층 간 구조적 비대칭성이 지배하게 됩니다. 마이크로 레벨에서 코어에 인접한 사설 L1 및 L2 캐시는 높은 주파수에서 잠금 해제된 상태로 계속 작동하며, 각 코어의 로컬 컴퓨팅 워크로드에 원시 실행 속도를 보장하기 위해 세밀하고 고전적인 64바이트 라인 레벨에서 작동합니다.
반면에 매크로 레벨에서는 거대한 512 MB L3 캐시가 운영 패러다임을 완전히 전환하여, 파편화된 라인의 관점으로 데이터를 보는 것을 거부합니다. 대신 L3는 미니 페이지 역할을 하는 큰 4 KB 청크 단위로 데이터를 가져오고 유지합니다. Z-Order 레이아웃 내에서 이러한 미니 페이지는 더 이상 RAM 행의 길고 선형적인 스트립이 아니라, 밀집된 공간적 하이퍼큐브입니다. L3가 엔트리를 채울 때, 매트릭스 내의 수평 및 수직 이웃을 동시에 포착하는 완전한 공간 타일(spatial tile)을 로드합니다. 그 결과, 캐시 히트율이 폭발적으로 증가하는데, 이는 알고리즘이 후속 반복에서 필요로 하는 데이터 요소들이 이미 캐시에 자리 잡고 있기 때문입니다.
분산형 NoC Bloom 필터를 통한 상호 연결 노이즈 완화
여기서 또 다른 주요 아키텍처 혁신이 등장합니다: 내부 Network-on-Chip (NoC) 패브릭의 라우터 내에 완전히 분산되어 임베딩된 4비트 슬라이스 카운팅 Bloom 필터(Counting Bloom Filter)의 도입입니다.
이 프레임워크를 단일의 거대한 중앙 집중식 블록으로 배치하는 대신 AMD Turin급 토포그래피에 매핑할 때, 글로벌 필터는 16개의 미세한 32 KB 세그먼트로 분할됩니다. 이들은 각 NoC 라우터 내부에 물리적으로 구현되어 있으며, 16개 코어 복합 다이(CCX) 각각에 직접 인접합니다. 이는 전체 다이에 걸쳐 단지 512 KB의 실리콘 면적을 차지합니다.
카운터당 4비트의 세분성을 활용함으로써, 이 구조는 바이트 레벨에서 완벽하게 정렬됩니다(바이트당 두 개의 인덱스 패킹). 이를 통해 1T에서 2T 사이의 짧은 시간 내에 디코딩 및 조회 작업이 가능해집니다. 이 글로벌 필터는 매크로 수준에서 활성 페이지를 추적하며, 엄청난 구조적 목적을 수행합니다: 중복 스눕(snoops)을 급격히 제거하고, 캐시 일관성 트래픽의 대다수를 요청된 데이터를 실제로 보유한 특정 CCX로 직접적인 포인트-투-포인트 경로를 통해 유도합니다.
L2 캐시 확장과 Tropf-Hertzog 엔진
프라이빗 L2 캐시 계층에서, 우리는 중요한 구조적 결정인 코어당 총 용량을 정확히 2 MB로 두 배 늘리는 것을 분석했습니다. 반도체 물리학에서 2 MB SRAM 배열은 본래 접근 경로에 약 +2T(두 클럭 사이클)의 지연 시간 페널티를 내재적으로 도입합니다. 하지만 이는 현대 소프트웨어 환경과 완벽하게 일치하는데, 왜냐하면 2 MB L2 면적은 리눅스 커널 내의 2 MB Huge Page 할당 창에 수학적으로 직접 매핑되기 때문입니다.
이러한 대칭성은 매우 예측 가능한 동작 패러다임을 제공합니다: 로컬 지연 시간이 2T만큼 증가함에도 불구하고, 단일 Huge Page로부터 전체 2 MB 작업 집합(working set)을 코어 레벨에서 네이티브하게 고정할 수 있는 능력은 그 비용을 상당히 상쇄하여 외곽 캐시 계층으로 향하는 긴 꼬리 요청(long-tail requests)을 급격히 줄여줍니다.
내부 실행 로직을 유지하기 위해 표준 64바이트 캐시 라인 접근 세분성(granularity)을 보존했습니다. 이 확장된 2MB 공간을 보호하기 위해 하드웨어 수준의 BIGMIN 및 LITMAX 함수를 구동하는 8개의 경계 레벨 Min/Max 범위 필터 배열을 배치했습니다. 이는 Vieweg Verlag가 독일 비스바덴에서 출판한 논문 Multidimensional Range Search in Dynamically Balanced Trees에 제시된 1981년 Tropf-Hertzog 알고리즘을 활용합니다.
Z-Order 레이아웃과 같은 공간 채우기 곡선(space-filling curves)의 치명적인 결함은 한 사분면에서 다른 사분면으로 점프할 때 거대한 선형 간격(linear gaps)을 생성한다는 것입니다. 기하학적 경계 상자(geometric bounding box)를 가로질러 쿼리를 실행하면, 기존의 이진 검색(binary search)은 유효 데이터 영역과 무효 데이터 영역이 메모리에서 혼란스럽게 뒤섞여서 아예 실패하게 됩니다.
시스템은 이를 매끄럽게 조율합니다. 코어가 Z-Order 주소 스트림을 순회하다가 경로가 현재 쿼리 창(query window) 밖에 놓이면, 하드웨어는 즉시 관련 없는 데이터 간격을 플래그 지정합니다. Tropf-Hertzog 로직은 현재 유효 블록의 끝에 대한 LITMAX 값과 다음 유용한 시퀀스의 시작에 대한 BIGMIN 값을 실시간으로 계산합니다. 느린 선형 스캔을 실행하거나 이웃 코어에 중복된 스눕(snoops)을 전송하는 대신, L2는 무효 주소 간격 전체를 완전히 건너뛰며 직접적인 순방향 도약(direct forward leap)을 수행합니다.
이러한 수학적 논리에 의해 구동되는 범위 필터와 Tropf-Hertzog 최적화는 95%의 경우에 걸쳐 1T 지연 시간 창(latency window) 내에서 수학적으로 정확한 '아니오'를 제공하여, L2가 캐시 라인을 검색하는 동안 경계에서 요청을 우회시킵니다. 주된 2MB TAG 배열은 더 이상 끊임없이 스래싱(thrashing)하지 않으며; 로컬 코어는 파이프라인 중단(pipeline stalls)을 덜 경험하고, 메모리 포트는 부담 없이 유지되며, 명령어 실행은 예측 가능성 면에서 막대한 향상을 얻습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 The Next Platform의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기