CUDA 런타임은 cudaHostAlloc()이라는 CUDA만의 호스트 메모리를 할당하는 방법을 제공하고 있다.
사실 malloc()과 cudaHostAlloc()으로 메모리를 할당하는 것에는 중요한 차이점이 존재한다. C 라이브러리 함수인 malloc()은 표준의 페이징(pageable)이 가능한 호스트 메모리를 할당하는 반면, cudaHostAlloc()은 잠긴 페이지의 호스트 메모리를 할당한다.
때때로 고정 메모리(pinned memory)라고 불리는 잠긴 페이지의 메모리 버퍼들은 하나의 중요한 속성을 가지고 있다. 이는 운영 체제가 해당 메모리를 절대로 디스크로 페이징하여 내보내지 않는 것을 보장하며 실제 물리 메모리에 존재하도록 해준다.
버퍼의 물리적인 주소를 알게됨으로써 GPU는 호스트로부터 또는 호스트로 데이터를 복사하기 위해 직접 메모리 접근(DMA) 방식을 이용할 수 있다. DMA 방식의 복사는 CPU의 개입 없이 진행되므로 복사 도중 CPU가 버퍼를 디스크로 페이징하여 내보내거나 운영체제의 페이지 테이블을 갱신하면서 버퍼의 물리적인 주소를 재위치시킬 수 있음을 의미하기도 한다.
CPU는 페이징이 가능한 메모리의 데이터를 이동시킬 수 있으므로 DMA 방식의 복사를 위해서는 고정 메모리를 사용하는 것이 필수다.
하지만 주의 할 점이 있다.
고정 메모리를 사용하는 것은 양날의 검이다. 고정 메모리를 사용하면 가상 메모리의 멋진 특징들을 효과적으로 이용하지 못한다. 구체적으로 말하면, 잠긴 페이지의 버퍼들은 디스크로 스왑(swap)될 수 없기 때문에 어플리케이션을 구동중인 컴퓨터는 잠긴 페이지의 모든 버퍼들에 대해 가용한 물리적인 메모리를 가져야만 한다. 이것은 시슽렘에서 표준 malloc()를 사용할 때보다 메모리 부족현상이 훨씬 빨리 발생할 수 있음을 의미한다. 이것은 어플리케이션이 더 적은 양의 물리적인 메모리로 인해 실패할 수 있음을 의미하며, 시스템에서 구동중인 다른 어플리케이션들의 성능에도 영향을 미칠 수 있음을 의미한다.
'Parallel Programming > CUDA' 카테고리의 다른 글
CUDA - GPU Memory Usage Check (0) | 2016.11.22 |
---|---|
CUDA - 스트림(stream) (0) | 2016.03.03 |
CUDA - 원자적 연산 (0) | 2016.03.03 |
CUDA - 시간 측정 (0) | 2016.02.26 |
CUDA - 2차원 배열의 할당과 이용 (0) | 2016.02.25 |