Main Content

GPU 프로그램 패러다임

GPU 가속 연산은 이종 프로그래밍 모델을 사용합니다. 즉, 소프트웨어 애플리케이션에서 고도로 병렬화 가능한 부분은 물리적으로 분리된 GPU 장치에서 실행되는 커널에 매핑되고, 나머지 순차적 코드에 해당하는 부분은 CPU에서 실행됩니다. 각 커널은 복수의 워커 또는 스레드가 할당되며 이들은 블록과 그리드 단위로 구성됩니다 커널 내의 모든 스레드는 서로에 대해 동시에 실행됩니다.

Heterogeneous programming model showing separation of application into sequential and parallelizable sections

GPU Coder™의 목표는 순차적인 MATLAB® 프로그램을 가져와서 이로부터 분할되고 최적화된 CUDA® 코드를 생성하는 것입니다. 이 과정은 다음 작업을 포함합니다.

  • CPU/GPU 분할 — CPU에서 실행되는 코드의 세그먼트와 GPU에서 실행되는 세그먼트를 식별합니다. GPU Coder가 CUDA 커널을 식별하는 다양한 방법에 대해서는 커널 생성 항목을 참조하십시오. CPU와 GPU 간의 메모리 전송 비용은 커널 생성 알고리즘에서 중요한 고려 사항입니다.

  • 커널 분할이 완료되면 GPU Coder는 CPU와 GPU 파티션 간의 데이터 종속 관계를 분석합니다. CPU와 GPU 간에 공유되는 데이터는 GPU 메모리에 할당됩니다(cudaMalloc 또는 cudaMallocManaged API를 사용). 이 분석은 또한 cudaMemcpy를 사용하여 CPU와 GPU 간에 데이터를 복사해야 하는 최소한의 위치 집합을 결정합니다. CUDA에서 통합 메모리를 사용하는 경우, 동일한 분석 과정을 통해 올바른 기능 동작을 얻기 위해 코드에서 cudaDeviceSync 호출이 삽입되어야 하는 최소한의 위치도 결정합니다.

  • 다음으로, 각 커널 내에서 GPU Coder는 데이터를 공유 메모리 또는 상수 메모리에 매핑하도록 선택할 수 있습니다. GPU 메모리 계층 구조의 일부인 이러한 메모리를 적절하게 사용하면 더 큰 메모리 대역폭을 확보할 수 있습니다. GPU Coder가 공유 메모리 매핑을 선택하는 방법에 대한 자세한 내용은 Stencil Processing 항목을 참조하십시오. GPU Coder가 상수 메모리 매핑을 선택하는 방법에 대한 자세한 내용은 coder.gpu.constantMemory 항목을 참조하십시오.

  • 분할과 메모리 할당 및 전송 명령문이 준비되면 GPU Coder는 분할 및 메모리 할당 결정을 따르는 CUDA 코드를 생성합니다. 생성된 소스 코드는 MEX 타깃으로 컴파일하여 MATLAB 내에서 호출하거나 공유 라이브러리로 컴파일하여 외부 프로젝트와 통합할 수 있습니다. 자세한 내용은 Code Generation Using the Command Line Interface 항목을 참조하십시오.

관련 항목