2012-02-16 2 views
4

GPGPU 계산 작업시 CPU가 프로그램 코드를 GPU로 이동하는 방법과 관련된 정보를 찾고 있습니다. 인터넷은 데이터 전송에 관한 많은 매뉴얼이지만, 명령어/프로그램로드에 관한 설명서는 아닙니다.CPU와 GPU 간의 명령어 전송

문제는 프로그램이 CPU에 의해 처리되는데, 주어진 작업을 수행하기 위해 각 컴퓨팅 장치에 적절한 플래그가있는 GPU를 "구성"합니다. 그 후에 데이터가 전송되고 처리됩니다. 전나무 작업은 어떻게 끝나나요? GPU에 대한 지침은 어떻게 발행됩니까? 지침에 따라 버스 대역폭을 활용하는 패킷이 있습니까? 나는 근본적인 무언가를 무시했을지도 모른다. 그래서 어떤 추가 정보도 환영 받는다.

답변

3

실제로 그것에 대해 많은 정보가 없지만 효과를 과대 평가합니다.

전체 커널 코드는 GPU에 한 번만로드됩니다 (최악의 경우 커널 당 한 번 호출되지만 실제로 응용 프로그램 당 한 번 실행되는 것처럼 보입니다. 아래 참조). 그런 다음 완전히 실행됩니다 CPU의 개입없이 GPU. 따라서 전체 커널 코드는 커널 호출 이전에 하나의 청크에 복사됩니다. 코드 크기를 측정하기 위해 집에서 만든 MD 패키지 (52 개 커널 중 일부는 150 개 코드 라인)의 모든 GPU 코드의 .cubin 크기는 단지 91 KiB이므로 거의 모든 경우에 코드 전송 시간은 무시해도 좋습니다.

여기 내가 공식 문서에서 발견 한 내용은 무엇입니까 :

CUDA Driver API에서 코드가 장치에 전화 할 시간을로드 cuModuleLoad

는 CUDA 드라이버 API가 게으르게에 시도하지 않는 기능 모듈에 필요한 리소스 을 할당하십시오. 기능과 데이터에 대한 메모리 모듈에 필요한 (상수 및 글로벌) 할당 할 수없는 경우, cuModuleLoad는() 모듈을 언로드 한 다음이있는 경우, 다시로드해야 할 수도 있습니다,

이론적으로 실패 동시에로드되는 너무 많은 상수 (또는 정적으로 할당 된 전역) 메모리를 사용하는 몇 가지 모듈이지만 매우 드문 경우이며 일반적으로 컨텍스트를 생성 한 직후에 응용 프로그램 실행 당 한 번만 cuModuleLoad을 호출합니다.

CUDA Runtime API은 모듈로드/언로드를 제어하는 ​​방법을 제공하지 않지만 초기화하는 동안 필요한 코드가 모두 장치에로드 된 것처럼 보입니다.

OpenCL Specs은 CUDA 드라이버 API만큼 구체적이지는 않지만 코드는 clBuildProgram 단계의 기기에 복사 된 것 같습니다.

+0

나는 일이 어떻게 행해지 는가에 관심이있다. 특히, GPU가 각 커널 내부에서 루프/if-else를 처리하는 방법. – amnl

+0

@ amnl 분기는 [CUDA C 프로그래밍 가이드] (http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf)의 4.1 절에서 다루며 본질적으로 AMD의 GPU (증명 링크 없음, 미안) : "한 번에 하나의 공통 명령을 실행하는 워프 [32 연속 스레드] ... 데이터 종속 조건부 분기를 통해 워프의 스레드가 분기되면 연속적으로 각 분기가 실행됩니다 경로에없는 스레드를 비활성화하고 모든 경로가 완료되면 스레드가 다시 같은 실행 경로로 수렴합니다. " – aland

관련 문제