
데이터 이동의 중요성: 산술 처리량과 메모리 성능의 불균형
수십 년 동안 컴퓨팅 성능은 몇 가지 주요 사양으로 쉽게 설명할 수 있었다. CPU는 클록 속도와 코어 수, GPU는 셰이더 처리량과 테라플롭스, 메모리는 주파수, 스토리지는 순차 전송 속도로 판매되었다. 이러한 수치들은 여전히 중요하지만, 현대 프로세서는 산술 연산을 수행하는 능력이 매우 뛰어나게 발전하면서 이론적인 성능 중 실제로 얼마나 많은 부분을 사용할 수 있는지를 결정하는 또 다른 문제가 점점 더 중요해지고 있다. 바로 '데이터를 필요한 시점에 필요한 곳으로 가져오는 것'이다.
현대 CPU 코어는 매 클록 사이클마다 여러 명령어를 실행할 수 있다. 고성능 GPU는 수천 개의 산술 장치를 병렬로 포함한다. AI 가속기는 행렬 곱셈 처리량을 페타플롭스 범위로 끌어올린다. 그러나 이러한 장치들은 피연산자, 명령어, 텍스처, 지오메트리, 모델 가중치, 중간 결과 또는 다른 형태의 데이터 없이는 유용한 것을 계산할 수 없다. 이는 근본적인 불균형을 초래한다. 사실상 산술 처리량은 수년 동안 엄청나게 확장되었지만, 데이터를 이동하는 것은 지연 시간, 대역폭, 에너지 및 물리적 칩 자원 측면에서 비교적 훨씬 더 비싸다. 결과적으로 많은 현대 워크로드는 실행 장치에 데이터를 계속 공급하기 위해 놀라울 정도로 많은 노력을 기울인다.
그렇다고 모든 워크로드가 '메모리 바운드'라는 의미는 아니다. 사실 전혀 그렇지 않다. 성능은 여전히 컴퓨팅 처리량, 명령어 종속성, 분기 예측, 동기화, 소프트웨어 오버헤드, 스토리지, 네트워킹 또는 수많은 다른 요인에 의해 제약될 수 있다. 달라진 점은 메모리 동작을 이해하는 것이 현대 컴퓨팅 성능을 이해하는 데 필수적이 되었다는 것이다. 그리고 '메모리 성능' 자체는 주파수나 용량을 훨씬 넘어선다. 지연 시간, 대역폭, 지역성, 캐시 용량, 메모리 수준 병렬 처리, 접근 패턴, 프리페칭, 용량, 인터커넥트 토폴로지, 심지어 데이터가 물리적으로 어디에 상주하는지까지 모두 상호작용한다. 그 이유를 이해하려면 아마도 가장 중요한 구분인 '데이터가 어떻게 접근되는지'부터 시작해야 한다.
데이터 접근 패턴: 순차 접근과 무작위 접근
1GB 파일을 처음부터 끝까지 읽는다고 상상해 보자. 다음 데이터 조각의 위치는 완벽하게 예측 가능하다. 시스템이 사용자가 무엇을 하는지 파악하면 명시적으로 요청되기 전에 미래 데이터를 가져오기 시작할 수 있다. 이것이 순차 접근 패턴이며, 현대 컴퓨터는 이를 처리하는 데 매우 능숙하다. CPU에는 예측 가능한 메모리 스트림을 인식하도록 특별히 설계된 하드웨어 프리페처가 포함되어 있다. DRAM 컨트롤러는 여러 트랜잭션을 처리 중인 상태로 유지하고 요청을 재정렬할 수 있다. SSD 컨트롤러는 많은 NAND 다이와 채널에 접근을 분산시킨다. GPU는 인접 스레드의 메모리 요청을 더 큰 트랜잭션으로 결합할 수 있다. 하드웨어는 본질적으로 파이프라인을 구축할 수 있다. 불행히도 무작위 접근은 극복하기 훨씬 더 어려운 장애물이다.
각 항목에 다음 항목의 주소가 포함된 연결 리스트를 탐색하는 것을 생각해 보자. 프로세서는 현재 접근이 완료될 때까지 다음 접근이 어디로 갈지 알 수 없을 수 있다. 이는 프리페칭 기회를 대부분 파괴하고 기계가 접근을 효율적으로 중첩하는 것을 방해한다. 이것이 두 워크로드가 동일한 양의 데이터를 이동하더라도 극적으로 다른 속도로 실행될 수 있는 이유다. 지연 시간 종속성이 관련될 때 이 구분은 더욱 중요해진다. CPU가 관련 없는 4개의 캐시 라인을 요청하면 여러 캐시 미스를 동시에 처리 중인 상태로 유지하고 지연 시간의 상당 부분을 중첩시킬 수 있다. 그러나 요청 B가 요청 A의 결과에 의존하는 경우, B는 A가 완료될 때까지 시작할 수 없다.
이는 포인터 추적을 통해 일반적으로 설명된다. 각 로드는 다음 로드의 주소를 드러내어 프로세서가 추측이나 병렬 처리를 통해 숨기는 대신 실제 메모리 지연 시간의 훨씬 더 많은 부분을 지불하도록 강제한다. 동일한 원리가 컴퓨팅의 모든 곳에 나타난다. 작고 예측 불가능한 조회를 수행하는 데이터베이스는 대용량 파일을 복사하는 것과는 매우 다른 문제를 제시한다. 일관된 인접 텍셀을 샘플링하는 GPU는 관련 없는 주소를 추적하는 수천 개의 스레드와 다르게 동작한다. 수백 킬로바이트를 순차적으로 읽는 SSD는 흩어진 4KB 블록을 검색하는 것과는 근본적으로 다른 워크로드를 본다. 이것은 또한 성능 향상을 위해 무작위 접근을 단순히 '순차 접근으로 바꿀' 수 없는 이유를 설명한다. 그럼에도 불구하고 소프트웨어 개발자들은 그렇게 하려고 노력한다. 데이터베이스는 데이터를 재구성한다. 게임 엔진은 작업을 일괄 처리한다. GPU 알고리즘은 요청을 재정렬한다. 컴파일러는 데이터 레이아웃을 변경한다. 구조체 배열은 때때로 배열 구조체를 대체할 수 있다. 정렬은 흩어진 접근을 비교적 일관된 접근으로 변환할 수 있다. 그러나 그렇게 하는 것이 항상 가능한 것은 아니다. 사실, 다음 주소가 현재 작업의 결과에 의존한다면 그 종속성은 실제다. 광선이 3D 장면의 예측 불가능한 부분으로 튕겨 나갈 수 있다면 GPU는 모든 미래 접근을 미리 알 수 없다. 데이터베이스 사용자가 특정 레코드를 요청한다면 먼저 인접한 테라바이트의 레코드를 읽는 것은 분명히 목적에 어긋날 것이다. 따라서 목표는 무작위 접근을 제거하는 것보다 '비용이 많이 드는 접근이 가능한 한 드물고, 예측 가능하며, 동시에 발생하도록 하는 것'이다.
캐시와 메모리 계층 구조의 중요성
다행히 실제 소프트웨어는 항상 완전히 임의의 데이터에 접근하지는 않는다. 사실 프로그램은 일반적으로 '공간 지역성'과 '시간 지역성'을 모두 나타내는 경향이 있다. 공간 지역성은 프로그램이 한 데이터 조각에 접근하면 곧 근처 데이터가 필요할 가능성이 상대적으로 높다는 것을 의미한다. 시간 지역성은 최근에 접근한 데이터가 다시 접근될 가능성이 합리적으로 높다는 것을 의미한다. 배열을 처리하는 루프는 뛰어난 공간 지역성을 갖는다. 자주 참조되는 게임 세계 데이터는 강한 시간 지역성을 가질 수 있다. 핫 루프(매우 자주 실행되는 컴퓨터 코드 섹션) 내의 명령어는 두 가지 유형의 지역성을 모두 나타낸다. 이러한 속성이 캐시를 실현 가능하게 만든다.
CPU가 DRAM에서 바이트를 필요로 할 때 일반적으로 해당 바이트만 전송하지 않는다. 데이터는 캐시 라인이라는 고정 크기 블록으로 캐시 계층을 통해 이동한다. 주류 x86 CPU에서는 일반적으로 64바이트다. 예를 들어 AMD의 최적화 문서는 64바이트 캐시 라인 주변의 소프트웨어 배치 및 접근 고려 사항을 설명한다. 프로그램이 나중에 인접 데이터에 접근하면 이미 캐시 내에 있을 수 있다. 이는 또 다른 중요한 개념인 '작업 세트'를 도입한다. 프로그램은 특정 단계에서 메모리의 작은 부분만 반복적으로 작동하면서 기술적으로 수십 기가바이트의 메모리를 할당할 수 있다. 이 활성 작업 세트가 빠른 캐시에 들어맞으면 성능은 매우 우수할 수 있다. 사용 가능한 캐시 용량을 약간 초과하여 작업 세트를 늘리면 갑자기 훨씬 더 많은 접근이 더 느린 계층 수준으로 유출된다. 이는 놀라울 정도로 급격한 성능 변화를 초래할 수 있다. 이것이 캐시 용량 개선이 때로는 엄청난 이득을 가져오고 때로는 거의 아무런 이득도 가져오지 않는 이유다. 캐시를 32MB에서 96MB로 늘리는 것은 60MB의 자주 재사용되는 작업 세트가 온칩에 유지될 수 있도록 한다면 매우 가치 있다. 워크로드가 다시는 건드리지 않는 몇 기가바이트의 데이터를 반복적으로 스트리밍하는 경우에는 이점이 상당히 적다. 따라서 캐시는 소프트웨어가 '기억할 가치가 있는 것'을 제공할 때 가장 잘 작동한다.
이는 명백한 질문을 제기한다. 캐시가 그렇게 유용하다면 단순히 거대한 초고속 캐시를 만들고 더 느린 메모리는 잊어버리면 되지 않을까? '메모리에서 원하는 속성이 서로 충돌하기 때문이다.' 용량이 증가함에 따라 작은 로컬 캐시의 속도를 유지하는 것이 점점 더 어려워지며, 이것이 계층 구조가 존재하는 주된 이유다. L1 캐시는 실행 코어에 매우 가깝게 위치할 만큼 작아서 매우 낮은 지연 시간으로 데이터를 제공한다. L2는 약간 더 높은 지연 시간으로 더 많은 용량을 제공한다. 마지막 수준(현대 CPU에서는 일반적으로 L3) 캐시는 훨씬 더 많은 용량을 제공하며 코어 간에 공유될 수 있지만, 접근하는 것은 일반적으로 다시 더 느리다. 모든 수준에서 미스하면 요청은 결국 훨씬 더 느린 DRAM으로 이동해야 한다.
캐시 설계는 용량보다 훨씬 더 깊이 들어간다. 연관성은 데이터 블록이 배치될 수 있는 위치에 영향을 미치고 충돌 미스를 줄일 수 있지만, 더 많은 조회 유연성은 복잡성을 증가시킨다. 캐시 뱅킹은 병렬 접근 능력을 증가시킬 수 있다. 여러 포트는 처리량을 향상시키지만 면적과 전력을 소모한다. 프라이빗 캐시는 개별 코어에 빠른 로컬 접근을 제공하는 반면, 공유 캐시는 총 용량을 더 효율적으로 사용하고 특정 형태의 데이터 공유를 단순화할 수 있다. 인텔은 아키텍처 연구에서 이러한 정확한 설계 긴장을 논의하며, 캐시 구성을 크기, 연관성, 지연 시간, 대역폭, 프라이빗 대 공유 조직, 확장성 및 에너지 효율성 사이의 균형 잡힌 행위로 설명했다. 그리고 '일관성'이 있다. 여러 CPU 코어가 동일한 메모리의 복사본을 캐시할 때 시스템은 그들이 모순된 버전의 데이터에 무기한으로 작동하지 않도록 해야 한다. 이러한 일관된 보기를 유지하는 것은 특히 코어 수가 증가함에 따라 추가적인 통신 및 장부 정리를 생성한다. 따라서 더 많은 캐시가 항상 보편적인 이점을 제공하는 것은 아니다.
AMD의 3D V-Cache 기술은 엔지니어들이 트레이드오프를 해결하는 또 다른 방법을 찾은 훌륭한 현대적 예시다. AMD는 CPU 코어 다이를 수평으로 극적으로 확장하는 대신 추가 캐시 다이를 수직으로 쌓는다. 2세대 구현은 직접 구리-구리 본딩과 TSV(Through-Silicon Via)를 사용하여 64MB L3 캐시 다이를 추가한다. 게임에서 Ryzen X3D 프로세서의 인기는 추가 캐시가 워크로드의 작업 세트와 일치할 때 어떤 일이 발생하는지 실질적으로 보여준다. 게임은 끊임없이 세계 상태, 드로우 콜 데이터, 물리 구조, 애니메이션, 가시성 정보 및 수많은 다른 데이터 구조를 조작한다. 자주 재사용되는 정보를 CPU에 더 가깝게 유지하면 DRAM으로의 비용이 많이 드는 이동을 줄일 수 있다. 그러나 여기에서도 게임마다 이득이 상당히 다르다. 일부는 이미 중요한 데이터를 기존/더 작은 캐시에 맞춘다. 다른 일부는 다른 곳에서 제약된다. 일부는 엄청난 이점을 얻는다. 이러한 가변성은 메모리 계층 이론이 정확히 예측하는 바다.
DRAM과 병렬 처리의 중요성
결국 캐시에 없는 데이터는 주/시스템 메모리 또는 DRAM에서 가져와야 한다. DRAM은 SRAM보다 훨씬 더 큰 용량을 비트당 비용의 일부로 제공하지만, 상당히 느리다. 따라서 엔지니어들은 대역폭과 병렬 처리로 이를 보완한다. 현대 DRAM은 내부적으로 뱅크와 뱅크 그룹으로 나뉜다. 이 뱅크 내에는 메모리 셀의 행이 있다. 데이터에 접근하는 것은 일반적으로 원하는 열을 읽거나 쓰기 전에 행을 행 버퍼로 활성화하는 것을 포함한다. 이는 세 가지 단순화된 시나리오로 이어진다. 필요한 행이 이미 활성화되어 있으면 컨트롤러는 '행 버퍼 히트'를 얻는다. 관련 행이 열려 있지 않으면 하나를 활성화해야 한다. 뱅크에 현재 잘못된 행이 열려 있으면 새 행을 활성화하기 전에 기존 행을 먼저 닫아야 할 수 있다. 따라서 메모리 컨트롤러는 단순히 CPU 요청을 맹목적으로 전달하는 것 이상을 수행한다. 미결 트랜잭션을 추적하고 광범위한 메모리 타이밍 제약 조건을 준수하면서 채널, 랭크, 뱅크 그룹 및 뱅크에 걸쳐 효율적으로 스케줄링하려고 시도한다.
이것이 메모리 대역폭과 메모리 지연 시간을 상호 교환 가능한 측정값으로 취급해서는 안 되는 이유 중 하나다. 사실, 지연 시간은 특정 작업이 걸리는 시간을 설명한다. 대역폭은 시간당 전송할 수 있는 데이터 양을 설명한다. 시스템은 엄청난 총 대역폭을 가질 수 있지만, 종속적인 무작위 메모리 접근 체인을 처리하는 데는 상대적으로 좋지 않을 수 있다. 반대로, 수백 개의 독립적인 트랜잭션을 처리 중인 상태로 유지할 수 있는 워크로드는 상당한 지연 시간을 허용하면서도 인상적인 전체 처리량에 근접할 수 있다. DDR5 메모리는 현대 메모리 설계가 병렬 처리에 얼마나 강력하게 의존하는지 보여준다. DDR4와 비교하여 DDR5는 뱅크 그룹 수를 늘리고, 기본 버스트 길이를 8에서 16으로 두 배로 늘리며, DIMM을 두 개의 독립적인 서브채널로 나눈다. 마이크론은 특히 뱅크 그룹을 늘리면 덜 제한적인 뱅크 그룹 타이밍을 사용할 확률이 높아지고 더 많은 메모리 페이지를 동시에 열어둘 수 있다고 언급한다.
이는 DRAM 튜닝이 때때로 실망스러울 정도로 일관성 없는 결과를 주는 이유를 설명하기도 한다. 전송 속도를 높이면 이론적인 대역폭이 증가한다. 타이밍을 조이면 다양한 지연 시간을 줄일 수 있다. 랭크를 추가하면 사용 가능한 병렬 처리에 영향을 미칠 수 있다. 그런 다음 메모리 컨트롤러, CPU 아키텍처 및 애플리케이션 동작이 실제 소프트웨어에 도달하는 개선의 양을 결정한다. 따라서 압축 벤치마크, 게임, 데이터베이스 및 대용량 파일 복사는 동일한 메모리 업그레이드에 매우 다르게 반응할 수 있다.
GPU, HBM, AI 가속기에서의 메모리 성능
GPU는 수천 개의 실행 레인이 동시에 데이터를 요청할 수 있으므로 엄청난 대역폭을 필요로 한다. 따라서 소비자용 GPU는 비교적 넓은 인터페이스를 통해 연결되고 매우 높은 전송 속도로 작동하는 GDDR 메모리를 사용한다. AI 및 HPC 가속기는 '고대역폭 메모리(HBM)'로 이를 더욱 발전시킨다. HBM은 메모리 패키지를 프로세서 주변에 배치하고 기존 보드 수준 인터페이스를 통해 구동하는 대신, DRAM 다이를 쌓고 고급 패키징을 통해 처리 장치에 매우 가깝게 위치한 매우 넓은 인터페이스를 사용한다. 그 결과는 탁월한 대역폭과 전송 비트당 우수한 에너지 효율성이지만, 패키징 복잡성과 비용이 상당히 증가한다.
AMD의 Instinct MI355X는 오늘날 관련된 규모를 유용하게 보여준다. 단일 가속기는 288GB의 HBM3E를 탑재하고 최대 '8TB/s의 이론적인 메모리 대역폭'을 제공한다. 따라서 8-GPU 시스템은 2.3TB의 HBM을 포함한다. 이러한 수치는 데스크톱 CPU에는 터무니없이 과도할 것이다. 그러나 현대 AI의 경우, 컴퓨팅 하드웨어에 데이터를 공급하는 것이 핵심적인 아키텍처 문제 중 하나가 되었다. 주로 대규모 언어 모델(LLM) 형태의 현대 생성형 인공지능은 원시 산술 처리량이 이야기의 일부만을 설명할 수 있는 가장 명확한 예시를 제공한다. 대규모 신경망은 엄청난 수의 행렬 연산을 포함하며, 이는 현대 GPU 및 전용 AI 가속기가 실행하도록 구축된 것이다. 그러나 프로세서는 산술 장치가 유용한 작업을 수행하기 전에 모델 가중치, 활성화 및 중간 데이터를 여전히 검색해야 한다.
훈련은 시스템이 모델의 가중치보다 훨씬 더 많은 것을 유지해야 하므로 특히 메모리 집약적이다. 훈련 기술과 최적화 도구에 따라 기울기, 최적화 도구 상태, 역전파를 위해 유지되는 활성화 및 임시 작업 공간도 필요할 수 있다. 추론은 이러한 요구 사항 중 일부를 제거하지만 자체적인 메모리 문제를 생성한다. 70억 개의 매개변수를 가진 대규모 언어 모델을 예로 들어보자. 16비트 정밀도에서 가중치만으로도 KV 캐시와 런타임 오버헤드를 고려하기 전에 약 14GB가 필요하다. 양자화는 각 매개변수를 16비트에서 8비트 또는 4비트로 줄여 모델을 저장하고 이동하는 데 필요한 메모리 양을 줄이므로 도움이 된다. 이것이 저정밀도 형식이 저장 용량 이상을 개선하는 이유다. 메모리 트래픽이 제한 요소일 때 메모리에서 이동하는 바이트 수가 적으면 성능이 직접적으로 향상될 수 있다. 더 큰 교훈은 AI를 훨씬 넘어선다. '재계산과 데이터 이동은 종종 상호 교환 가능한 비용이다.' 때로는 결과를 저장하는 것이 다시 계산하는 것보다 저렴하다. 때로는 값을 다시 계산하는 것이 먼 메모리에서 검색하는 것보다 저렴하다. '현대 아키텍처는 점점 더 이러한 트레이드오프의 어느 쪽이 이기는지 결정하려고 노력한다.'
게임 워크로드와 메모리 성능
게임은 '단일 게임 워크로드'가 없기 때문에 특히 흥미롭다. 한 순간 CPU는 가시성/컬링 구조를 탐색하고 드로우 콜을 준비할 수 있다. 다른 스레드는 물리 또는 AI를 업데이트할 수 있다. GPU는 동시에 지오메트리를 처리하고, 텍스처를 샘플링하고, 재료 데이터를 읽고, 렌더 타겟을 쓰고, 셰이더를 평가하고, 가속 구조에 접근한다. 오픈 월드 타이틀에서는 자산이 백그라운드에서 스토리지에서 시스템 메모리 및 VRAM으로 스트리밍될 수도 있다. 이러한 작업 중 일부는 매우 일관성이 있지만 다른 일부는 그렇지 않다. 이는 여러 하드웨어 트렌드를 설명하는 데 도움이 된다.
CPU 측면에서 AMD의 X3D 프로세서는 대규모 마지막 수준 캐시를 사용하여 게임에서 사용되는 작업 세트의 더 많은 부분을 캡처한다. 중요한 게임 데이터가 그렇지 않으면 DRAM으로 반복적으로 이동해야 할 때 이점은 상당할 수 있다. GPU에서 대규모 마지막 수준 캐시는 마찬가지로 외부 VRAM 트래픽을 줄여 유효 메모리 대역폭을 높이고 중요한 데이터에 대한 접근 지연 시간을 극적으로 낮춘다. NVIDIA, AMD 및 인텔은 모두 GPU 세대에 걸쳐 캐시 구조를 상당히 변경했다. 이는 오프칩 트랜잭션을 피하는 것이 물리적 메모리 대역폭의 동일한 큰 증가 없이 유효 메모리 성능을 향상시킬 수 있기 때문이다. 실시간 레이 트레이싱은 데이터 동작을 다시 더 어렵게 만든다. 사실, 광선은 장면 지오메트리의 어떤 부분과 교차할지 결정하는 트리형 데이터 구조인 '바운딩 볼륨 계층(BVH)'을 탐색한다. 기존의 래스터화된 워크로드와 달리 광선은 분기하여 장면의 완전히 다른 영역으로 이동할 수 있다. 이것은 중요한 예시인데, 더 빠른 메모리가 항상 메모리 문제에 대한 유일한 해결책이 아니라는 것을 보여주기 때문이다. 때로는 기존 메모리 서브시스템을 더 효율적으로 사용할 수 있도록 작업을 재구성하는 것이 더 나은 옵션이다. 게임은 대역폭이나 지연 시간보다 '용량'에 의해 제약될 수도 있다. 필요한 텍스처, 지오메트리 및 렌더 리소스가 VRAM 용량을 초과하면 시스템은 PCI-Express 버스를 통해 시스템 메모리에서 리소스를 이동하거나 제거하고 다시 로드해야 할 수 있다. 이론적인 대역폭이 엄청난 GPU도 애초에 로컬 메모리에 상주하지 않는 데이터를 보상할 수 없다. 따라서 '메모리 성능은 한 프레임 내에서도 여러 차원을 갖는다. 즉, 로컬에 얼마나 많은 데이터가 들어맞는지, 얼마나 빨리 접근할 수 있는지, 접근이 얼마나 효과적으로 합쳐지는지, 캐시가 재사용을 얼마나 잘 캡처하는지, 그리고 아키텍처가 얼마나 많은 병렬 트래픽을 유지할 수 있는지'다.
스토리지 성능의 복잡성
스토리지는 단일 대역폭 수치가 얼마나 오해의 소지가 있을 수 있는지 가장 쉽게 보여주는 예시를 제공한다. 현대 PCIe NVMe SSD는 환상적인 순차 처리량을 광고하지만, 순차 전송은 극도로 유리한 워크로드다. 대규모 연속 요청은 컨트롤러가 NAND 채널, 다이 및 플레인에 걸쳐 작업을 효율적으로 분산시키고 많은 작업을 처리 중인 상태로 유지할 수 있도록 한다. 그러나 실제 애플리케이션은 종종 매우 다른 것을 요구한다. 운영 체제, 게임, 데이터베이스 및 애플리케이션은 드라이브 전체에 흩어져 있는 수천 개의 비교적 작은 데이터 조각을 요청할 수 있다. 이것이 SSD 사양이 순차 처리량과 무작위 IOPS, 큐 깊이 및 지연 시간을 구분하는 이유다.
Solidigm의 워크로드 문서는 순차 접근을 인접 블록으로, 무작위 접근을 미디어 전체에 분산된 블록으로, 큐 깊이를 미결 I/O 요청 수로 정의한다. 결정적으로, 큐 깊이를 늘리면 더 많은 병렬 작업을 노출하여 처리량을 향상시킬 수 있지만, 이는 지연 시간을 희생한다. 이는 개념적으로 DRAM과 매우 유사하다. 사실, NAND 플래시 메모리 기반 SSD는 컨트롤러 뒤에서 병렬로 작동하는 많은 플래시 다이를 포함한다. NAND 자체는 페이지와 더 큰 지우기 블록으로 구성되며, 쓰기는 DRAM에서 바이트를 덮어쓰는 것처럼 처리될 수 없다. 컨트롤러는 주소 변환, 웨어 레벨링, 가비지 컬렉션 및 기타 백그라운드 작업을 수행하여 NAND가 일반적인 블록 장치처럼 보이도록 한다. 이러한 프로세스는 SSD가 호스트가 요청한 것보다 더 많은 데이터를 물리적으로 쓰는 '쓰기 증폭'이라는 추가적인 내부 트래픽을 생성할 수 있다. 가비지 컬렉션은 지속적인 워크로드 동안 지연 시간 스파이크를 유발할 수도 있다.
소비자용 SSD는 빠른 쓰기 캐싱을 통해 계층에 또 다른 계층을 추가하는 경우가 많다. 사실, NAND의 일부는 일시적으로 SLC와 유사한 모드로 작동하여 데이터를 나중에 더 밀집된 TLC 또는 QLC 스토리지로 통합하기 전에 빠르게 쓰기를 수락할 수 있다. 일부 드라이브는 데이터 매핑을 위해 DRAM을 포함하는 반면, DRAM 없는 설계는 호스트 메모리 버퍼와 같은 기술을 사용하여 매핑 구조의 일부를 시스템 메모리에 유지할 수 있다. 다시 한번, 스토리지 장치는 자체 메모리 계층을 효과적으로 구축했다. '그리고 빠른 캐시가 소진되면 지속적인 쓰기 성능은 제품 페이지에 표시된 짧은 벤치마크 버스트와 매우 다르게 보일 수 있다.'
결론: 메모리 계층 구조와 효율적인 데이터 이동
이 시점에서 메모리 벤치마크에 컨텍스트가 필요한 이유가 명확해져야 한다. 대용량 파일 복사는 지속적인 순차 대역폭을 원한다. 지연 시간에 민감한 데이터베이스는 작은 무작위 접근과 꼬리 지연 시간에 훨씬 더 신경 쓸 수 있다. 밀집된 배열에서 작동하는 과학 시뮬레이션은 스트리밍 대역폭과 벡터화를 훌륭하게 활용할 수 있다. 컴파일러는 비교적 낮은 공간 및/또는 시간 지역성을 가진 복잡한 데이터 구조를 추적하는 데 상당한 시간을 보낼 수 있다. CPU 제한 게임은 핫 작업 세트가 캐시에 들어맞으면 더 큰 마지막 수준 캐시로부터 엄청난 이점을 얻을 수 있지만, 다른 게임은 거의 반응하지 않을 수 있다. AI 훈련은 엄청난 컴퓨팅 처리량, 용량 및 대역폭을 동시에 필요로 한다. 낮은 동시성 LLM 디코딩은 메모리 대역폭에 훨씬 더 크게 의존할 수 있다. 긴 컨텍스트 추론은 KV 캐시를 추가하고 사용 가능한 메모리 용량을 또 다른 핵심 리소스로 만든다. '대역폭'이라는 단어조차도 자격이 필요하다. 이론적인 인터페이스 대역폭, 지속적인 애플리케이션 대역폭, 캐시 대역폭, DRAM 대역폭, 스토리지 대역폭 및 인터커넥트 대역폭이 있다. 워크로드는 하나를 포화시키면서 다른 하나는 거의 사용하지 않을 수 있다. '궁극적으로 성능을 결정하는 것은 애플리케이션의 데이터 접근 패턴이 전체 계층 구조와 어떻게 상호작용하는지다.'
이것이 현대 프로세서에서 가장 흥미로운 개선 사항 중 일부가 단순히 더 빠른 산술 장치가 아닌 이유다. 캐시는 재사용된 데이터를 실행 리소스에 가깝게 유지하고, 프리페처는 미래 접근을 예측하며, 메모리 컨트롤러는 DRAM 병렬 처리를 노출하기 위해 요청을 재정렬하고, GPU 스레드 스케줄링은 일관성을 개선하려고 시도하며, 타일링은 큰 문제를 더 작은 메모리에 맞는 작업 세트로 분할하고, 압축은 전송해야 하는 바이트 수를 줄이며, 양자화는 AI 모델에 대해서도 거의 동일한 작업을 수행하고, HBM은 매우 넓은 인터페이스를 통해 많은 양의 메모리를 가속기에 물리적으로 더 가깝게 이동시키고, 3D 스태킹은 모든 메모리 비트를 동일한 평면 다이에 강제하지 않고 용량을 추가하며, 칩렛은 설계자가 특수 컴퓨팅, 캐시 및 I/O 구조를 더 유연하게 결합할 수 있도록 하고, 점점 더 정교해지는 인터커넥트는 CPU, GPU 및 가속기 간의 통신이 다음 장벽이 되는 것을 방지하려고 시도한다. 공통된 주제는 간단하다. '비용이 많이 드는 데이터 이동을 가능한 한 효율적으로 사용하는 것'이다.
원시 컴퓨팅 성능은 계속 상승할 것이다. 메모리 대역폭도 상승하고, 캐시는 커지고, HBM은 더 빨라지고, SSD는 초당 수십 기가바이트로 더 나아갈 것이며, 고급 패키징은 이전에 분리된 구성 요소를 더 가깝게 만들 것이다. 그러나 물리적 거리, 에너지, 용량 및 지연 시간은 어떤 단일 메모리 기술도 엄청난 용량, 엄청난 대역폭, 무시할 만한 지연 시간 및 무시할 만한 비용을 동시에 제공할 수 없도록 보장한다. 따라서 메모리 계층 구조는 사라지지 않을 것이며, 오히려 더 깊고 정교해지고 있다. '현대 성능은 점점 더 프로세서가 요청하기 전에 올바른 데이터를 해당 계층 구조의 올바른 수준에 배치하고, 동일한 데이터를 다시 이동하는 대신 재사용할 수 있도록 소프트웨어를 구성하는 데 달려 있다.'
종속적인 메모리 접근을 위해 수백 클록 사이클을 기다리는 CPU 코어는 유용한 컴퓨팅이 아니다. VRAM을 기다리는 수천 개의 유휴 산술 장치를 가진 GPU는 유용한 컴퓨팅이 아니다. 페타플롭스 능력이 있지만 모델 데이터가 부족한 AI 가속기는 유용한 컴퓨팅이 아니다. 애플리케이션이 14GB/s SSD를 사용하기 위해 필요한 요청을 효율적으로 발행하고 처리할 수 없다면 그 또한 유용한 컴퓨팅이 아니다. 결국 가장 빠른 작업은 종종 데이터를 더 빨리 가져오는 것이 아니다. 그것은 '가져오기를 완전히 피하는 것'이다.
출처: Wccftech
원문: https://wccftech.com/why-memory-performance-is-more-important-than-ever-in-modern-computing/



