Linux 커널 관점에서 볼 때 사용자 프로그램은 CUDA GPU와 어떻게 통신합니까?

Linux 커널 관점에서 볼 때 사용자 프로그램은 CUDA GPU와 어떻게 통신합니까?

CUDA 프로그램을 실행할 때 CPU와 GPU 메모리 사이에서 데이터가 어떻게 복사되는지 궁금합니다. 구체적으로 이 과정에 리눅스 커널이 어떻게 관여하는지 알고 싶습니다.

몇 가지 가능한 가정이 있습니다.

  1. CUDA 사용자 라이브러리는 GPU를 파일로 취급 read(2)하고 write(2)각 트랜잭션에 대한 합계를 호출합니다.
  2. CUDA 사용자 라이브러리에서는 Linux가 mmap(2)관련 제어 레지스터(DMA 레지스터, PIO 레지스터 및 기타 MMIO 레지스터)를 사용자 공간에 넣은 다음 사용자 모드에서 GPU에서 임의 작업을 수행하도록 요구합니다.
  3. 다른 건 없나요?

strace(1)나는 데이터를 1000번 앞뒤로 복사하고 그 사이에 빈 커널을 실행하는 간단한 CUDA 프로그램을 실행하여 가설 1을 제거했습니다. 여기서 write(2).read(2)

time(1)가설 #2 는 전송된 데이터의 양이 user시간이 아닌 시간에 따라 달라지는 것으로 관찰되었기 때문에 가능한 것 같습니다 sys. 그래서 프로그램은 사용자 모드에서 데이터를 복사하는 것 같습니다.

그런데 조금 이상한 것 같습니다. 사용자 프로그램이 그렇게 중요한 I/O 제어 레지스터를 스스로 작동하도록 허용하는 방법은 무엇입니까?

이 주제에 대한 전문적인 의견을 듣고 싶습니다.

답변1

애플리케이션은 시작 시 커널에서 mmap버퍼 세트를 요청하며 이 맵을 생성하는 것은 권한 있는 작업입니다.

일반 작업은 단순히 이러한 버퍼를 데이터(예: 텍스처, 정점 또는 명령)로 채우고 마지막으로 단일 커널 호출을 수행하여 제출된 명령 대기열을 시작합니다. 이 시동 스트로브는 수행되는 유일한 레지스터 액세스이며, 그 밖의 모든 것은 공유 메모리입니다.

GPU에는 필요한 경우를 제외하고 명령이 다른 컨텍스트에 속하는 데이터를 참조할 수 없도록 자체 기본 MMU가 있습니다(예: 게임의 렌더 대상을 오버레이의 렌더 대상과 결합하고 결과를 로컬에 쓰는 합성기) 화면 버퍼).

컴퓨팅 전용 워크로드의 경우 동일한 메커니즘이 잘 작동합니다. 명령 대기열은 "데이터를 화면으로 보내기"로 끝나지 않고 "호스트로 데이터 반환"으로 끝납니다.

관련 정보