Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

CUDA 코드가 포함된 MEX 함수 실행

CUDA 코드가 포함된 MEX 파일 작성하기

CUDA® 코드가 포함된 MEX 파일을 비롯한 모든 MEX 파일에는 mexFunction이라는 단일 진입점이 있습니다. MEX 함수에는 MATLAB®gpuArray 객체와 상호 작용하고 CUDA 코드를 시작하는 호스트 쪽 코드가 포함되어 있습니다. MEX 파일의 CUDA 코드는 CUDA 런타임 API를 따라야 합니다.

GPU 장치가 제대로 초기화되고 MATLAB에 인식될 수 있도록 MEX 파일에 대한 진입점에서 mxInitGPU 함수를 호출해야 합니다.

gpuArray 객체의 MEX 파일 작성에 사용하는 인터페이스는 표준 MATLAB 배열의 MEX 인터페이스와 다릅니다.

다음 파일에서 CUDA 코드가 포함된 MEX 파일의 예제를 살펴볼 수 있습니다.

파일에는 다음과 같은 CUDA 장치 함수가 포함되어 있습니다.

void __global__ TimesTwo(double const * const A,
                         double * const B,
                         int const N)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N)
        B[i] = 2.0 * A[i];
}

파일에는 배열 크기를 결정하고 적절한 크기의 그리드를 시작하는 다음과 같은 라인도 포함되어 있습니다.

N = (int)(mxGPUGetNumberOfElements(A));
blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
TimesTwo<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, N);

결과로 생성된 MEX 함수 실행하기

이 예제에서 MEX 함수는 입력 배열의 모든 요소에 2를 곱하여 출력 배열의 값을 얻습니다. 함수를 테스트하려면 모든 요소가 1인 gpuArray 행렬을 시작하십시오.

x = ones(4,4,"gpuArray");
y = mexGPUExample(x)
y = 

    2    2    2    2
    2    2    2    2
    2    2    2    2
    2    2    2    2

입력 배열과 출력 배열은 gpuArray 객체입니다.

CUDA 커널과 비교하기

Parallel Computing Toolbox™는 MATLAB과 CUDA 코드를 통합하는 데 사용할 수 있는 CUDAKernel 객체도 지원합니다. CU 파일과 PTX 파일을 사용하여 CUDAKernel 객체를 만들 수 있습니다. 일반적으로 MEX 파일을 사용하는 것이 CUDAKernel 객체를 사용하는 것보다 유연하며, 그 이유는 다음과 같습니다.

  • MEX 파일은 NPP(NVIDIA® Performance Primitives) 라이브러리 또는 cuFFT 라이브러리 등의 NVIDIA 라이브러리를 포함한 호스트 쪽 라이브러리에 대한 호출을 포함할 수 있습니다. 또한 MEX 파일은 CUDA 런타임 라이브러리의 함수에 대한 호스트 쪽 호출도 포함할 수 있습니다.

  • MEX 파일은 입력값의 크기를 분석하여 C 코드 또는 C++ 코드와 다른 크기의 메모리를 할당하거나 다른 크기의 그리드를 시작할 수 있습니다. 반면 CUDAKernel 객체를 호출하는 MATLAB 코드는 출력 메모리를 사전할당하고 그리드 크기를 결정해야 합니다.

복소수 데이터에 액세스하기

복소수 데이터는 GPU 장치에서 실수부/허수부 결합형 복소수로 저장됩니다. 즉, 복소수 gpuArray A의 경우 각 요소의 실수부와 허수부는 연속된 주소에 저장됩니다. MATLAB은 장치에 복소수 데이터를 저장하기 위해 CUDA에 내장된 벡터형을 사용합니다. 자세한 내용은 NVIDIA CUDA C++ Programming Guide를 참조하십시오.

커널이 필요로 하는 요건에 따라 포인터를 실수형 또는 내장 벡터형의 복소수 데이터로 형변환할 수 있습니다. 예를 들어, MATLAB에서 다음과 같은 행렬을 만든다고 가정합니다.

a = complex(ones(4,"gpuArray"),ones(4,"gpuArray"));

gpuArray를 MEX 함수에 첫 번째 인수 prhs[0]으로 전달하는 경우에는 다음과 같은 호출을 사용하여 복소수 데이터에 대한 포인터를 가져올 수 있습니다.

mxGPUArray const * A = mxGPUCreateFromMxArray(prhs[0]);
mwSize numel_complex = mxGPUGetNumberOfElements(A);
double2 * d_A = (double2 const *)(mxGPUGetDataReadOnly(A));

배열을 길이가 두 배인 실수 배정밀도 배열로 처리하려면 다음과 같은 호출을 사용합니다.

mxGPUArray const * A = mxGPUCreateFromMxArray(prhs[0]);
mwSize numel_real = 2*mxGPUGetNumberOfElements(A);
double * d_A = (double const *)(mxGPUGetDataReadOnly(A));

다음과 같은 Parallel Computing Toolbox 함수를 사용하여 GPU에서 복소수 형식과 실수 형식 간에 데이터를 변환할 수 있습니다. 이러한 연산에는 데이터를 실수부/허수부 결합형으로 만들기 위해 복사본이 필요합니다.

  • mxGPUCreateComplexGPUArray 함수는 2개의 실수 mxGPUArray 객체의 요소들을 실수부/허수부 결합형으로 만들어서(인터리빙해서) 길이가 같은 단일 복소수 mxGPUArray를 생성합니다.

  • mxGPUCopyReal 함수와 mxGPUCopyImag 함수는 각각 mxGPUArray의 실수부 요소 또는 허수부 요소를 단일 실수 mxGPUArray에 복사합니다.

mxGetImagData 함수에는 mxGPUArray 객체에 상응하는 값이 없습니다.

GPU MEX 파일 컴파일하기

MATLAB의 mexcuda 함수를 사용하여 CUDA 코드가 포함된 MEX 파일을 컴파일합니다. 기본적으로 mexcuda 함수는 MATLAB과 함께 설치된 NVIDIA CUDA 컴파일러(nvcc)를 사용하여 CUDA 코드를 컴파일합니다. 시스템에 설치된 C++ 호스트 컴파일러로 추가 컴파일 단계가 전달됩니다. mexcuda가 어떤 컴파일러를 사용 중인지 확인하려면, 세부 정보가 출력되도록 mexcuda 함수에서 -v 플래그를 사용합니다.

mexcuda mexGPUExample.cu

mexcudanvcc를 찾을 수 없는 경우 디폴트가 아닌 위치에 설치되었을 수 있습니다. 시스템에서 nvcc의 위치를 MW_NVCC_PATH 환경 변수에 저장하여 지정할 수 있습니다. setenv 명령을 사용하여 이 변수를 설정할 수 있습니다. 예를 들면 다음과 같습니다.

setenv("MW_NVCC_PATH","/usr/local/CUDA/bin")

지원되는 호스트 컴파일러

mexcuda 함수를 사용하여 MEX 파일을 컴파일하려면, 지원되는 C++ 호스트 컴파일러가 설치되어 있어야 합니다. mexcuda는 Visual Studio® 컴파일러의 서브셋만 지원합니다. 사용 중인 컴파일러가 지원되는지 여부를 확인하려면 다음 단계를 따르십시오.

  1. CUDA 툴킷 설치하기(선택 사항)에 나와 있는 표를 참고하여 사용 중인 MATLAB 버전에서 어떤 버전의 CUDA를 사용하는지 확인합니다.

  2. 1단계에서 확인한 CUDA 버전에 해당하는 NVIDIA CUDA Toolkit Documentation을 참고합니다. 이 문서의 설치 안내 섹션에 지원되는 컴파일러가 나와 있습니다.

CUDA 툴킷 설치하기(선택 사항)

MATLAB과 함께 설치된 CUDA 툴킷에는 CUDA 툴킷에서 사용할 수 있는 모든 라이브러리가 포함되어 있지 않습니다. MATLAB과 함께 설치되지 않은 특정 라이브러리를 사용하려면 CUDA 툴킷을 설치하십시오.

참고

GPU에서 MATLAB 함수를 실행하거나 CUDA 지원 MEX 함수를 생성하기 위해 CUDA 툴킷이 필요하지는 않습니다.

CUDA 툴킷에는 컴파일하기 위한 CUDA 라이브러리와 툴이 포함되어 있습니다.

사용 중인 MATLAB 버전에 적절한 CUDA 툴킷 버전을 다운로드합니다. 다음 표를 참고하여 사용 중인 MATLAB 버전과 호환되는 툴킷 버전을 확인하십시오. NVIDIA의 모든 업데이트와 패치를 포함하여 지원되는 CUDA 툴킷의 최신 버전을 사용하는 것이 가장 좋습니다.

MATLAB 릴리스CUDA 툴킷 버전
R2023b11.8
R2023a11.8
R2022b11.2
R2022a11.2
R2021b11.0
R2021a11.0
R2020b10.2
R2020a10.1
R2019b10.1
R2019a10.0
R2018b9.1
R2018a9.0
R2017b8.0
R2017a8.0
R2016b7.5
R2016a7.5
R2015b7.0
R2015a6.5
R2014b6.0
R2014a5.5
R2013b5.0
R2013a5.0
R2012b4.2
R2012a4.0
R2011b4.0

CUDA 툴킷에 대한 자세한 내용을 알아보고 지원되는 버전을 다운로드하려면 CUDA Toolkit Archive(NVIDIA)를 참조하십시오.

참고 항목

| |

관련 항목