2014-01-06 4 views
2

4 개의 GPU가 있고 50 개의 CUDA 프로그램을 병렬로 실행하고 싶다고 가정 해 보겠습니다. 제 질문은 : NVIDIA 드라이버가 다른 GPU에서 50 개의 CUDA 프로그램을 실행할만큼 똑똑합니까 아니면 각 프로그램에 대해 CUDA 장치를 설정해야합니까? 복수의 GPU와 복수의 실행 파일

+0

정확히 어떤 CUDA 드라이버입니까? 이 질문에 대한 답이 두 가지 이상 있습니다. – talonmies

+0

리눅스에서 cuda 5.5와 함께 nvidia 드라이버 버전 331.20을 사용하고 있습니다. – adk

+0

탈론의 대답은 훌륭합니다. 추가 할 내용이 있습니다. CUDA 프로그램이 NVIDIA 엔진을 사용하는 경우 워크로드 배포가 아직 지원되지 않았는지 확인하십시오. 만약 그들이 일반적인 CUDA 프로그램이라면 탈론의 대답은 아마도 IMHO로가는 유일한 방법 일 것입니다. –

답변

5

을 만들 수있는 첫 번째 점을 감사 당신은 그냥 CUDA 플랫폼에 대한 4 개 GPU에서 병렬 50 응용 프로그램 을 실행할 수 있다는 것입니다. Hyper-Q 지원 GPU를 사용하는 경우 최대 32 개의 스레드 또는 MPI 프로세스가 GPU에 대한 대기열 작업을 수행 할 수 있습니다. 그렇지 않으면 단일 명령 대기열이 있습니다.

최신 Kepler Tesla 카드가 아닌 CUDA 드라이버는 한 번에 하나의 활성 컨텍스트 만 지원합니다. GPU에서 하나 이상의 응용 프로그램을 실행하면 프로세스는 "선착순"방식으로 서로 경쟁하는 컨텍스트를 갖게됩니다. 한 응용 프로그램이 장시간 실행중인 커널 또는 다른 응용 프로그램을 차단하면 선제 또는 다른 프로세스로 프로세스를 양보하게하는 다른 요소가 없습니다. GPU를 디스플레이 관리자와 공유 할 때 응용 프로그램에서 컨텍스트가 종료되기까지 몇 초의 상한을 부과하는 워치 독 타이머가 있습니다. 결과적으로 한 번에 하나의 컨텍스트 만 하드웨어에서 실행됩니다. 컨텍스트 스위칭은 무료가 아니며 단일 장치에 대해 여러 프로세스가 경쟁하는 데 성능이 저하 될 수 있습니다.

또한 GPU에있는 모든 컨텍스트에는 장치 메모리가 필요합니다. Linux에서 묻는 플랫폼에서 메모리 페이징이 없으므로 모든 컨텍스트의 리소스가 GPU 메모리에 공존해야합니다. 현재의 GPU에서 12 개의 사소한 컨텍스트가 동시에 실행될 수 있다고 믿지는 않습니다 - 그 번호보다 먼저 사용 가능한 메모리가 부족할 것입니다. 더 많은 응용 프로그램을 실행하려고하면 컨텍스트 설정이 실패합니다.

여러 GPU에서 여러 응용 프로그램을 배포하는 드라이버의 동작은 Linux 드라이버가 하나 이상의 GPU가 기본이 아닌 계산 모드에있는 경우를 제외하고는 GPU간에 인텔리전트 프로세스 배포를 수행하지 않습니다 . 특별히 요청 된 장치가 없으면 드라이버는 프로세스 나 스레드를 실행할 수있는 유효한 첫 번째 유효한 무료 GPU를 항상 찾으려고 시도합니다. GPU가 사용 중이며 연산 배타적 (스레드 또는 프로세스)으로 표시되거나 금지 된 것으로 표시된 경우 드라이버는 실행할 GPU를 찾으려고 할 때 건너 뜁니다. 모든 GPU가 독점적으로 사용 중이거나 사용이 금지 된 경우 유효한 응용 프로그램 사용 가능 오류가 발생하여 응용 프로그램이 실패합니다.

요약하면 Hyper-Q 장치 이외의 모든 장치에 대해서는 사용자가 요구하는대로 성능 향상이 없습니다 (반대의 경우도 마찬가지입니다) 시도해도 성능이 저하 될 것으로 예상됩니다. 훨씬 건전한 방법은 Torque 또는 이전 Sun Grid Engine 버전 중 하나와 같은 자원 관리 작업 스케줄러와 함께 계산 배타성을 사용하는 것입니다.이 스케줄러는 GPU 가용성에 따라 프로세스가 일정한 방식으로 실행되도록 예약 할 수 있습니다. 이것이 대부분의 범용 HPC 클러스터가 다중 gpu 환경에서 일정을 처리하는 방법입니다.