Main Content

coder.gpu.kernelfun

함수를 GPU 커널에 매핑하는 프라그마

설명

예제

coder.gpu.kernelfun()은 상주하는 함수 내의 모든 계산을 GPU에 매핑하려고 시도하는 전역 수준의 프라그마입니다. 이 함수 내의 루프는 병렬 루프 분석 검사를 통과한 경우에만 GPU 커널로 병렬화됩니다. 이 분석은 모든 루프 반복이 서로 독립적이라는 것을 증명하려고 합니다. 또한 코드 생성기는 반복 횟수가 적거나 최소한의 계산을 수행하는 단순한 루프에 대해서는 GPU 커널을 생성하지 않습니다. 이러한 루프를 병렬화하면 커널 생성 및 GPU와 CPU 간 메모리 전송으로 인한 오버헤드로 인해 코드 성능이 저하될 수 있습니다.

kernelfun 프라그마에는 입력 파라미터가 필요하지 않습니다. 이 프라그마는 루프 파라미터를 기반으로 차원이 자동으로 계산되는 커널을 생성합니다.

이 함수는 코드 생성 함수입니다. MATLAB®에서는 이 함수가 아무런 효과가 없습니다.

예제

모두 축소

이 예제에서는 함수에서 kernelfun 프라그마를 사용하고 CUDA® 코드를 생성하는 방법을 보여줍니다.

하나의 파일에 진입점 함수 scalars를 작성하고, 각각 크기가 1x4096인 두 개의 벡터 입력값 x,y와 하나의 스칼라 입력값 scale을 인수로 받도록 합니다. 이 함수에는 반복 길이가 서로 다른 두 개의 for 루프가 있으며, 하나는 벡터 덧셈을 위한 것이고 다른 하나는 누적합을 구하기 위한 것입니다. scalars 함수 내에 coder.gpu.kernelfun() 프라그마를 추가합니다.

function [vout, sout1] = scalars(x,y,scale)
    coder.gpu.kernelfun;
    sout1 = 0;
    vout = coder.nullcopy(zeros(1,1024));
    
    for i=1:1024
        vout(i) = x(i) + y(i);
    end

    for i=1:4096
        sout1 = (x(i)*scale) + sout1;    
    end
end

codegen 함수를 사용하여 CUDA MEX 함수를 생성합니다.

codegen -config coder.gpuConfig('mex')...
 -args {ones(1,4096,'double'),ones(1,4096,'double'),coder.typeof(0)}...
 -report scalars

GPU Coder는 벡터 덧셈과 누적합을 위한 커널을 생성합니다.

  scalars_kernel1<<<dim3(8U, 1U, 1U), dim3(128U, 1U, 1U)>>>(*gpu_y, *gpu_x,
                                                            *gpu_vout);
  scalars_kernel2<<<dim3(4U, 1U, 1U), dim3(1024U, 1U, 1U)>>>(scale, *gpu_x,
                                                             gpu_sout1);

벡터 덧셈을 위한 커널에는 각 요소의 덧셈을 위한 스레드 하나씩 총 1024개의 스레드가 있습니다. 마찬가지로 누적합을 위한 커널에는 총 4096개의 스레드가 있습니다.

버전 내역

R2017b에 개발됨