1. 고정메모리.
- 가상메모리를 사용하지 않고, 메모리에 직접 접근하여 처리하는 접근 방식.
- 가상 메모리와 물리적 메모리간의 치환 제거.
- CUDA 스트림을 사용하기 위해서는 고정 메모리는 필수다.
- 관련 함수
1. cudaMallocHost
2. cudaFreeHost
2. 제로 메모리.
- 호스트와 디바이스간에 메모리 복사를 하지 않고, 고정된 메모리[Pinned Memory]영역에 바로 엑세스하여 데이터를 읽고 쓸수 있는 메모리.
- PCI를 사용해서 전송 속다가 빨라 지는 것은 아니지만.
- 데이터를 계산하고, 결과값을 메모리에 쓰면 비동기 양방향 PCI 전송이 진행되기 때문에, 그 만큼 성능향상을 볼 수 있다.
- 전제조건
- 맵드 메모리를 사용할 때, 글로벌 메모리의 결합 전송과 동일한 조건을 커널에서 충족시켜야 한다.
글로벌 메모리 결합 전송조건.
- 글로벌 메모리를 읽어 올 때 최대 밴드 폭을 사용할 수 있는 조건 - 사실 최신 사양에서는 무시해도 되지 않나 싶다.[개인생각]
- 주의-
- 커널에서 작은 크기의 데이터를 많은 횟수로 맵드 메모리를 엑세스 하게 되면, 통상적인 데이터 전송보다 떨어지는 효과를 얻을 수 있다.
- 관련 함수
1 cudaHostAlloc
2 cudaHostGetDevicePointer
3 예제:
3.포터블 고정 메모리.
- 제로 메모리는 하나의 디바이스에서만 유효하기 때문에, 두개의 디바이스상에서 문제가 된다. 즉 두개의 호스트 스레드를 생성하여 처리하게 되는데, 이 때 하나의 스레드에서 생성한 고정된 메모리는 다른 쓰레드에서는 사용할 수 없게 되어, 자원 낭비를 하게 된다.
이런 자원 낭비를 피하고자 사용하는 것이 포터블 고정 메모리라고 한다.
- 적용.
cudaHostAlloc() 세번째 파라미터: cudaHostAllocMapped | cudaHostAllocPortable 옵션 지정.
'팁 > CUDA' 카테고리의 다른 글
커널함수 (0) | 2017.01.16 |
---|---|
스트림. (0) | 2017.01.04 |
메모리 타입. (0) | 2017.01.03 |
CUDA 컴파일 옵션. (0) | 2017.01.03 |
쓰레드 ID 구하기. (0) | 2016.12.29 |