Main Content

parallel.gpu.CUDAKernel

GPU에서 실행 가능한 커널

설명

CUDAKernel 객체는 GPU에서 실행 가능한 CUDA 커널을 나타냅니다. CU 파일과 PTX 파일로부터 커널을 만듭니다. CUDAKernel 객체를 만들고 사용하는 방법에 대한 예제는 GPU에서 CUDA 또는 PTX 코드 실행하기 항목을 참조하십시오.

참고

CUDAKernel 객체에 대해 save 또는 load를 수행할 수 없습니다.

생성

설명

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile)은 PTX 코드 ptxFile과 CUDA® 소스 파일 cuFile을 사용하여 CUDAKernel 객체를 만듭니다. PTX 파일에는 단일 진입점만 포함되어야 합니다.

kern을 입력값으로 하여 feval을 사용해 GPU에서 CUDA 커널을 실행합니다. 커널 객체 실행에 대한 자세한 내용은 CUDAKernel 실행하기 항목을 참조하십시오.

예제

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile,func)func로 정의된 함수 진입점에 대한 CUDAKernel을 만듭니다. func는 PTX 파일에서 적절한 커널 진입점을 명확하게 정의해야 합니다.

예제

kern = parallel.gpu.CUDAKernel(ptxFile,cProto)는 PTX 파일 ptxFile과 C 프로토타입 cProto를 사용하여 CUDAKernel 객체를 만듭니다. cProtokern이 나타내는 커널 호출에 대한 C 함수 프로토타입입니다. PTX 파일에는 단일 진입점만 포함되어야 합니다.

예제

kern = parallel.gpu.CUDAKernel(ptxFile,cProto,func)func로 정의된 함수 진입점에 대해 PTX 파일과 C 프로토타입에서 CUDAKernel 객체를 만듭니다. func는 PTX 파일에서 적절한 커널 진입점을 명확하게 정의해야 합니다.

입력 인수

모두 확장

PTX 파일 또는 PTX 코드의 이름입니다.

PTX 파일의 이름을 제공하거나 파일 내용을 string형으로 전달할 수 있습니다.

예: "simpleEx.ptx"

데이터형: char | string

CUDA 소스 파일의 이름으로, 문자형 벡터로 지정됩니다.

이 함수는 CUDA 소스 파일을 검토하여 PTX 코드에 정의된 CUDA 커널에 대한 함수 프로토타입을 찾습니다. CUDA 소스 파일에는 '__global__'로 시작하는 커널 정의가 포함되어야 합니다.

예: "simpleEx.cu"

데이터형: char | string

함수 진입점으로, 문자형 벡터로 지정됩니다. func는 PTX 파일에서 적절한 진입점을 명확하게 정의해야 합니다.

참고

parallel.gpu.CUDAKernel 함수는 PTX 파일에서 지정된 진입점을 검색하여 부분문자열이 일치하는 경우를 모두 확인합니다. 따라서 진입점의 이름을 다른 진입점의 부분문자열을 사용해서 지정하면 안 됩니다.

예: "add1"

데이터형: char | string

커널 호출에 대한 C 프로토타입으로, 문자형 벡터로 지정됩니다. 여러 입력 인수는 쉼표로 구분하여 지정합니다.

예: "float *,float,int"

데이터형: char | string

속성

모두 확장

커널 스레드의 블록 크기로, 길이가 1, 2 또는 3인 양의 정수 벡터로 지정됩니다(스레드 블록은 최대 3차원일 수 있기 때문). ThreadBlockSize 요소의 곱은 이 커널에 대한 MaxThreadsPerBlock을 초과할 수 없으며, ThreadBlockSize의 요소는 GPUDevice 속성 MaxThreadBlockSize에 대응하는 요소를 초과할 수 없습니다.

예: [8 8 8]

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

읽기 전용 속성입니다.

이 CUDA 커널에 대해 단일 블록에서 허용되는 최대 스레드 수입니다. ThreadBlockSize 요소의 곱은 이 값을 초과할 수 없습니다.

예: 1024

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

스레드 블록의 그리드 크기로, 길이가 3인 정수 벡터로 지정됩니다. 사실상 GPU가 독립적으로 실행하는 스레드 블록의 수입니다. 이 벡터의 어떤 요소도 GPUDevice 객체의 MaxGridSize 속성으로 구성된 벡터에서 대응하는 요소를 초과할 수 없습니다.

예: [977 1 1]

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

각 스레드 블록이 사용할 수 있는 동적 공유 메모리의 양(단위: 바이트)입니다. 각 스레드 블록에는 사용 가능한 공유 메모리 영역이 있습니다. 이 메모리는 멀티프로세서의 레지스터와 공유됩니다. SharedMemorySizeGPUDevice 객체의 MaxShmemPerBlock 속성을 초과할 수 없습니다.

모든 메모리와 마찬가지로 커널을 시작하기 전에 이 메모리가 할당되어야 합니다. 이 공유 메모리 영역의 크기는 스레드 블록의 크기와 연결되는 것이 일반적입니다. 커널에서 이 값을 설정하면 블록의 각 스레드가 사용 가능한 공유 메모리 영역에 액세스할 수 있습니다.

예: 16000

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

읽기 전용 속성입니다.

커널에서 호출한 PTX 코드의 진입점 이름입니다.

예: "_Z13returnPointerPKfPy"

데이터형: char | string

읽기 전용 속성입니다.

커널이 지원하는 좌변 인수의 최대 개수입니다. 이는 우변 인수 개수보다 클 수 없으며 입력값이 상수거나 스칼라인 경우 더 작을 수 있습니다.

예: 1

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

읽기 전용 속성입니다.

이 커널을 호출하는 데 필요한 우변 인수 개수입니다. 모든 입력값은 입력값의 스칼라 값, 벡터 입력값/출력값의 요소 또는 출력 인수의 크기를 정의해야 합니다.

예: 5

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

읽기 전용 속성입니다.

길이가 NumRHSArguments인 문자형 벡터로 구성된 셀형 배열입니다. 각 문자형 벡터는 해당 입력값에 대해 예상되는 MATLAB® 데이터형을 uint8, single 또는 double 같은 숫자 유형으로 지정하고, 그 뒤에 단어 scalar 또는 vector를 지정하여 참조로 전달할지 값으로 전달할지를 나타냅니다. 또한 해당 인수가 커널에 대한 입력값일 경우에는 접두사 in이 붙고, 입력값/출력값일 경우에는 접두사 inout이 붙습니다. 이렇게 하면 MATLAB 배열과 gpuArray 객체를 모두 사용하여 커널을 효율적으로 호출하는 방법을 결정하고 출력값으로 처리되는 커널 입력값을 확인할 수 있습니다.

예: {'inout double vector'} {'in double vector'} {'in double vector'} {'in uint32 scalar'} {'in uint32 scalar'}

데이터형: cell

객체 함수

fevalEvaluate kernel on GPU
setConstantMemorySet some constant memory on GPU
existsOnGPUGPU에서 gpuArray 또는 CUDAKernel을 사용할 수 있는지 여부를 확인합니다.

예제

모두 축소

이 예제에서는 PTX 파일과 CU 파일을 사용하거나 PTX 파일과 함수 프로토타입을 사용하여 CUDAKernel 객체를 만드는 방법을 보여줍니다.

CUDA 소스 파일 simpleEx.cu에는 다음 코드가 포함되어 있습니다.

/*
* Add a constant to a vector.
*/
__global__ void addToVector(float * pi, float c, int vecLen)  {
   int idx = blockIdx.x * blockDim.x + threadIdx.x;
   if (idx < vecLen) {
       pi[idx] += c;
   }
}

-ptx 옵션과 함께 mexcuda를 사용하여 CU 파일을 PTX 파일로 컴파일합니다.

mexcuda -ptx simpleEx.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

PTX 파일과 CU 파일을 사용하여 CUDA 커널을 만듭니다.

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","simpleEx.cu");

PTX 파일과 addToVector 함수의 함수 프로토타입을 사용하여 CUDA 커널을 만듭니다.

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","float *,float,int");

위의 두 명령문은 모두 addToVector CUDA 커널을 호출하는 데 사용할 수 있는 커널 객체를 반환합니다.

이 예제에서는 진입점이 둘 이상인 PTX 파일에서 CUDAKernel 객체를 만드는 방법을 보여 줍니다.

CU 파일 myfun.cu에 2개의 double형을 더하기 위한 함수 add1과 2개의 벡터를 더하기 위한 함수 add2가 있다고 가정합니다.

__global__ void add1( double * a, double b ) 
{
    *a += b;
}

__global__ void add2( double * v1, const double * v2 ) 
{
    int idx = threadIdx.x;
    v1[idx] += v2[idx];
}

-ptx 옵션과 함께 mexcuda를 사용하여 CU 파일을 PTX 파일로 컴파일합니다.

mexcuda -ptx myfun.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

PTX 파일은 add1 함수와 add2 함수에 대응하는 2개의 진입점을 포함합니다. PTX 코드에 여러 개의 진입점이 포함된 경우 커널을 만들 때 요소를 지정해야 합니다.

2개의 double형을 더하기 위한 커널을 만들고 진입점 add1을 지정합니다.

k = parallel.gpu.CUDAKernel("myfun.ptx","myfun.cu","add1");

버전 내역

R2010b에 개발됨