CUDA 고정 메모리가 그렇게 빠른 이유는 무엇입니까? len 바이트 동안 계속되는 주소 범위의

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에 복사됩니다. 따라서 고정 메모리를 사용하면 페이징 가능한 호스트 메모리에서 페이지 잠금 호스트 메모리로 복사하는 시간을 절약 할 수 있습니다.


답변

메모리 페이지가 아직 액세스되지 않은 경우, 그들은 아마도했다 시작하기에 스왑되지 않습니다 . 특히 새로 할당 된 페이지는 범용 “제로 페이지”의 가상 복사본이되며 기록 될 때까지 물리적 인스턴스화가 없습니다. 디스크에있는 파일의 새로운 맵은 읽거나 쓸 때까지 순수하게 디스크에 남아 있습니다.