2013-02-15 4 views
10

컴퓨팅 성능이 2.x 이상인 NVIDIA gpus가 upto 16 커널을 동시에 실행할 수 있음을 알고 있습니다. 그러나 내 응용 프로그램은 7 개의 "프로세스"를 생성하며이 7 개의 프로세스 각각은 CUDA 커널을 시작합니다.병렬로 CUDA 커널을 실행하는 여러 프로세스

첫 번째 질문은 이러한 커널의 예상되는 동작이 무엇인가하는 것입니다. 동시에 실행되거나 서로 다른 프로세스에 의해 실행되므로 순차적으로 실행됩니다.

쿠다 C 프로그래밍 가이드는 말한다 때문에 내가 혼란 스러워요 ". 하나 CUDA 컨텍스트에서 커널이 다른 CUDA 컨텍스트에서 커널과 동시에 실행할 수 없습니다"

이것은 두 번째 질문으로 CUDA의 "컨텍스트"는 무엇입니까?

감사합니다.

답변

14

CUDA 컨텍스트는 호스트 스레드 나 프로세스가 소유 한 코드와 데이터를 보유하는 가상 실행 공간입니다. 현재의 모든 하드웨어가있는 GPU에서는 하나의 컨텍스트 만 활성화 될 수 있습니다.

첫 번째 질문에 답하기 위해 문맥을 설정하고 동시에 동일한 GPU에서 실행하려는 7 개의 개별 스레드 또는 프로세스가있는 경우 프로세스가 직렬화되고 GPU에 대한 액세스를 기다리는 모든 프로세스가 차단됩니다. 실행 컨텍스트의 소유자가 산출합니다. 필자가 아는 한, 시간 슬라이스가없고 스케줄링 휴리스틱은 문서화되어 있지 않으며 운영 체제에서 운영 체제에 이르기까지 일정하지는 않습니다.

GPU 컨텍스트를 유지하는 단일 작업자 스레드를 시작하고 다른 스레드의 메시징을 사용하여 GPU로 작업을 푸시하는 것이 좋습니다. 또는 CUDA 드라이버 API에서 사용할 수있는 컨텍스트 마이그레이션 기능이 있지만 동일한 프로세스의 스레드에서만 작동하며 마이그레이션 메커니즘에는 대기 시간과 호스트 CPU 오버 헤드가 있습니다.

0

정말로 별도의 스레드와 컨텍스트가 있어야합니까? 단일 GPU의 다중 컨텍스트가 충분한 오버 헤드를 가져 오기 때문에 모범 사례가 GPU 당 사용 컨텍스트라고 생각합니다.

많은 커널을 concururllty로 실행하려면 하나의 CUDA 컨텍스트에서 몇 가지 CUDA 스트림을 생성하고 각 커널을 자체 스트림에 대기시켜야합니다. 따라서 충분한 리소스가있는 경우 동시에 실행됩니다.

몇 가지 CPU 스레드에서 컨텍스트에 액세스 할 수 있도록하려면 cuCtxPopCurrent(), cuCtxPushCurrent()를 사용하여 전달하면되지만 한 스레드 만 언제든지 컨텍스트에서 작업 할 수 있습니다.

+0

하나의 GPU에서 여러 컨텍스트가 동시에 활성화 될 수 있는지 확인 하시겠습니까? – Tariq

+0

@Tariq, 나는 진술하지 않았다.) 한 GPU에서 동시에 두 개의 컨텍스트를 가진 두 개의 프로그램을 실행할 수 있다는 것을 확인할 수 있지만, 둘 다 활성화되어 있거나 드라이버가 어떻게 든 워크 플로를 대체하는지는 알지 못한다. – ShPavel

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz

관련 문제