작업관리자 성능 탭에서 GPU를 선택해보면 다음과 같이 뜬다.
Nvidia RTX 3050 Ti Laptop
Nvidia RTX 4070 Ti
보면 '전용 GPU 메모리'와 '공유 GPU 메모리(CUDA의 공유 메모리 x)'가 존재한다.
여기서 의문이 들었다.
흔히 Nvidia memory architecture를 보면 위와 같이 Global Memory 혹은 DRAM이라고만 표기되어있다. 그렇다면 작업관리자에서 말하는 공유 메모리와 전용 메모리는 무엇일까??
GPU를 구매할 때 보면 VRAM이라고 써져있는 것을 볼 수 있다. 이것이 작업 관리자에서 말하는 전용 메모리이다. 또한 Nvidia memory architecture에서의 DRAM 혹은 Global Memory를 얘기한다.
이는 CUDA와 같은 것에서 일반적으로 cudaMalloc과 같은 함수로 할당된 공간으로 봐도 무방하다.
이 전용 메모리의 데이터만 GPGPU/Graphics 연산을 위해 각 SM들이 접근할 수 있다.
CUDA를 해보면 알겠지만, cudaMalloc으로 할당한 GPU의 공간에 CPU가 접근하면 (어찌보면 당연하게) 에러가 난다.
이처럼 CPU와 GPU가 완전히 격리된 메모리 공간을 '전용 GPU 메모리'라고 하며, GPU 연산을 할 때에는 이 전용 메모리만 접근해서 사용할 수 있다.
int* test;
cudaMalloc(&test, sizeof(int)*2000000000);
그러면 공유 메모리는 무엇일까? 위의 내용을 보면 짐작할 수 있다시피 CPU와 GPU가 완전히 격리되지 않는 메모리 공간을 얘기한다. 이는 CPU의 RAM 쪽에 일부 영역을 GPU를 위한 메모리를 할당한 다는 것이다. cuda의 함수로는 cudaHostAlloc 함수를 통해서 할당이 가능하다.
이 영역은 CPU(RAM)에 데이터가 있지만, GPU에서 사용할 수 있다. 다만, CPU(RAM)에서 GPU로 데이터 혹은, GPU에서 CPU(RAM)으로 데이터가 전송되는 시간이 추가로 들기 때문에 전용 GPU 메모리보다 훨씬 느리다.
또한 추가적인 flag 설정이 없을 경우 CPU에서는 접근을 하면 에러가 발생한다. (운영체제?적으로 막아놓았음.)
int* test;
cudaHostAlloc(&test, sizeof(int)* 2000000000, cudaHostAllocDefault);