GPU 메모리 구조는 CPU와는 다르게 여러 계층으로 복잡하게 설계되어 있다. 이러한 계층 구조는 성능을 최적화하고 병렬 처리를 효율적으로 수행하기 위해 필수적이다. 아래에서 주요 GPU 메모리 계층을 설명한다.
레지스터 파일
레지스터 파일은 각 CUDA 코어마다 존재하는 가장 빠른 메모리이다. 그러나 레지스터의 수가 한정되어 있어, 그 활용은 제한적이다. 레지스터는 워프(warp) 내부에서만 접근이 가능하며 스레드 간에 공유되지 않는다.
쉐어드 메모리 / L1 캐시
쉐어드 메모리와 L1 캐시는 각 블록 내에서 공유되고, 고속 접근이 가능한다. 쉐어드 메모리는 프로그래머가 명시적으로 제어할 수 있으며, 스레드 블록 내에서 데이터를 공유하는 데 사용된다. L1 캐시는 하드웨어에 의한 데이터 캐싱을 지원한다.
L2 캐시
L2 캐시는 모든 스레드 블록이 공유하는 캐시로, 다양한 스트림 멀티프로세서(SM) 간에도 데이터 공유가 가능한다. L2 캐시는 글로벌 메모리 접근 속도를 개선시키기 위해 사용되며, 대용량 데이터를 처리할 때 큰 도움이 된다.
글로벌 메모리
글로벌 메모리는 GPU의 주 메모리로 가장 높은 용량을 자랑하지만, 접근 속도는 상대적으로 느리다. 글로벌 메모리는 모든 스레드에서 접근 가능하며, 사용자의 데이터가 여기 저장된다. 효율적인 글로벌 메모리 접근 패턴은 성능 최적화에서 중요하다.
콘스턴트 메모리
콘스턴트 메모리는 읽기 전용 메모리로, 변화하지 않는 데이터를 저장하는 데 사용된다. 이 메모리는 캐싱이 가능하며, 빠른 접근이 가능한다.
텍스처 메모리
텍스처 메모리는 이미지 데이터를 다루기 위해 특별히 설계된 메모리로, 텍스처 캐시를 이용하여 효율적인 공간 국소성과 텍스처 필터링을 지원한다. 이는 그래픽 렌더링 및 데이터 시각화 작업에서 자주 사용된다.
지역 메모리
지역 메모리는 각 스레드마다 할당되는 메모리 공간으로, 스레드가 사용하는 변수들이 저장된다. 주로 레지스터가 부족할 때 사용된다.
제어 유닛과 메모리 버퍼
메모리 계층 간에 데이터 이동을 효율적으로 관리하기 위한 다양한 버퍼와 제어 유닛이 존재한다. 이를 통해 데이터 이동과 접근 시간을 최적화한다.
잘 설계된 GPU 메모리 계층 구조는 병렬 처리를 위한 중요한 요소로 작용한다. 이러한 구성 요소를 적절히 활용하여 코드를 작성하는 것이 GPU 성능 최적화의 핵심이다. 특히, 글로벌 메모리와 레지스터, 그리고 쉐어드 메모리 간의 데이터 이동을 최소화하고, 높은 메모리 대역폭을 효과적으로 활용하는 것이 중요하다.
다양한 메모리 계층과 그 특성을 이해하는 것은 고성능 GPU 어플리케이션 개발에 필수적이다. 특히, 어떤 데이터가 어느 메모리 계층에 저장되어야 하는지, 그리고 각 계층 간의 데이터 전송이 얼마나 최적화되어 있는지를 고려해야 한다. 이를 통해 병목 현상을 최소화하고, 최대의 성능 향상을 이룰 수 있다.