새로 생성 된 프로세스에서 CUDA를 초기화하는 것은 오늘날의 많은 서버급 시스템에서 상당 시간 (as long as a half-second) 이상 걸릴 수 있습니다. @RobertCrovella explains처럼 CUDA 초기화에는 대개 장치 및 호스트 메모리 맵의 조화가 포함 된 통합 메모리 모델 설정이 포함됩니다. 이것은 많은 메모리를 가진 머신에 꽤 오랜 시간이 걸릴 수 있습니다. 이 긴 지연에 기여하는 다른 요소가있을 수 있습니다.CUDA의 매우 긴 초기화 지연을 완화하려면 어떻게해야합니까?
복잡한 가상 메모리 매핑을 사용하지 않는 CUDA 활용 프로세스를 실행하려면이 효과가 매우 귀찮습니다. 각 프로세스는 "본질적으로"사실에도 불구하고 오래 기다려야합니다. CUDA가 마지막으로 초기화 한 초기화 코드 (아마도 약간의 정리 코드 포함)를 다시 사용할 수 있습니다.
이제 분명히, 모든 프로세스가 단일 프로세스 내에서 실행되도록 코드를 다시 작성하면 긴 초기화 비용을 절약 할 수 있습니다. 그러나 더 간단한 접근법이 아닌가? 정보 :
- 프로세스간에 동일한 상태 정보/CUDA 컨텍스트를 전달합니까?
- 대부분의 호스트 메모리를 모두 무시하도록 CUDA에 알려 주시겠습니까?
- 통합 메모리 조화를 지금보다 더 게으 르기 때문에 실제로 필요한 정도로만 발생합니다.
- 통합 메모리가있는 CUDA를 사용할 수 없으십니까?
- 사이드에 데몬 프로세스를 유지하고 이미 초기화 된 CUDA 상태를 래치하는 중입니까?
흠이 가지 무거운 중량 및 오버 헤드 - 라덴 소리. 항상 IPC를하고 싶지는 않지만 ... FOSS입니까? 아마도 그 중 하나의 하위 레이어 만 가져올 수 있고 더 간단한 대안을 함께 해킹 할 수 있습니다. – einpoklum
이것은 NVIDIA에서 제공 한 코드베이스입니다. 나는 그것이 폐쇄 된 소스라고 기대할 것이다. – talonmies
MPS는 폐쇄 소스입니다. 여러 GPU가있는 시스템의 일부 시나리오에서 일부 완화를 제공 할 수있는 또 다른 방법은 CUDA 런타임이 'CUDA_VISIBLE_DEVICES' [환경 변수] (http://docs.nvidia.com/cuda)를 통해 필요한 GPU 만 사용하도록 제한하는 것입니다 /cuda-c-programming-guide/index.html#env-vars). 이것은 프로세스별로 지정할 수 있습니다. 이 방법론은 특정 사전 파스칼 UM 시나리오에서 몇 가지 이점을 제공 할 수도 있습니다. –