CUDA 고정 메모리가 그렇게 빠른 이유는 무엇입니까?
CUDA 데이터 전송을 위해 고정 된 메모리를 사용할 때 데이터 전송 속도가 상당히 빨라집니다. Linux에서이를 달성하기위한 기본 시스템 호출은 mlock입니다. mlock의 man 페이지에서 페이지를 잠그면 교체되는 것을 방지한다고 명시되어 있습니다.
mlock ()은 addr에서 시작하여 len 바이트 동안 계속되는 주소 범위의 페이지를 잠급니다. 지정된 주소 범위의 일부를 포함하는 모든 페이지는 호출이 성공적으로 반환 될 때 RAM에 상주합니다.
내 테스트에서 시스템에 몇 기가의 여유 메모리가 있었으므로 메모리 페이지를 교체 할 수있는 위험이 없었지만 여전히 속도 향상을 관찰했습니다. 누구든지 여기서 실제로 무슨 일이 일어나고 있는지 설명 할 수 있습니까?, 통찰력이나 정보를 많이 주시면 감사하겠습니다.
CUDA 드라이버 는 메모리 범위가 잠겨 있는지 여부를 확인한 다음 다른 코드 경로를 사용합니다. 잠긴 메모리는 물리적 메모리 (RAM)에 저장되므로 장치는 CPU (DMA, 일명 비동기 복사, 장치는 물리적 페이지 목록 만 필요)에서 도움없이이를 가져올 수 있습니다. 잠금되지 않은 메모리는 액세스시 페이지 오류를 생성 할 수 있으며 메모리 (예 : 스왑에있을 수 있음)에 저장 될뿐만 아니라 드라이버가 잠금되지 않은 메모리의 모든 페이지에 액세스하고 고정 된 버퍼에 복사하여 전달해야합니다. DMA (동기화, 페이지 별 복사)로.
여기에 설명 된대로 http://forums.nvidia.com/index.php?showtopic=164661
비동기 mem 복사 호출에 사용되는 호스트 메모리는 cudaMallocHost 또는 cudaHostAlloc을 통해 페이지를 잠 가야합니다.
또한 developer.download.nvidia.com에서 cudaMemcpyAsync 및 cudaHostAlloc 매뉴얼을 확인하는 것이 좋습니다. HostAlloc은 cuda 드라이버가 고정 된 메모리를 감지 할 수 있다고 말합니다.
드라이버는 this (cudaHostAlloc) 함수로 할당 된 가상 메모리 범위를 추적하고 cudaMemcpy ()와 같은 함수에 대한 호출을 자동으로 가속화합니다.
CUDA는 DMA를 사용하여 고정 된 메모리를 GPU로 전송합니다. 페이징 가능한 호스트 메모리는 디스크에 상주 할 수 있으므로 DMA와 함께 사용할 수 없습니다. 메모리가 고정되지 않은 경우 (예 : 페이지 잠금) 먼저 페이지 잠금 "스테이징"버퍼에 복사 된 다음 DMA를 통해 GPU에 복사됩니다. 따라서 고정 메모리를 사용하면 페이징 가능한 호스트 메모리에서 페이지 잠금 호스트 메모리로 복사하는 시간을 절약 할 수 있습니다.
메모리 페이지에 아직 액세스하지 않았다면 으로 시작하기 위해 스왑 인되지 않았을 것 입니다 . 특히 새로 할당 된 페이지는 범용 "제로 페이지"의 가상 복사본이되며 기록 될 때까지 물리적 인스턴스화가 없습니다. 디스크에있는 파일의 새 맵도 마찬가지로 읽거나 쓸 때까지 순수하게 디스크에 남아 있습니다.
참고 URL : https://stackoverflow.com/questions/5736968/why-is-cuda-pinned-memory-so-fast
'IT TIP' 카테고리의 다른 글
타겟팅 위치 : 현재 '멈춤'상태에있는 고정 요소 (0) | 2020.10.24 |
---|---|
String.Substring ()이 코드에 병목 현상이있는 것 같습니다. (0) | 2020.10.24 |
변수가 반복 가능하지만 문자열이 아니라는 것을 알려주는 방법 (0) | 2020.10.24 |
1000 개의 Entity Framework 개체를 만들 때 SaveChanges ()를 언제 호출해야합니까? (0) | 2020.10.24 |
ASP.NET MVC에서 Error.cshtml은 어떻게 호출됩니까? (0) | 2020.10.24 |