Main Content

Thrust 예제

GPU Coder™의 Thrust 라이브러리 지원을 통해 sort와 같은 GPU 가속 프리미티브를 활용하여 복잡한 고성능 병렬 애플리케이션을 구현할 수 있습니다. MATLAB® 코드에서 sort 대신 gpucoder.sort 함수를 사용하면 GPU Coder가 Thrust sort 프리미티브에 대한 호출을 생성할 수 있습니다.

이 예제는 행렬의 열을 내림차순으로 정렬하는 CUDA® 코드를 생성합니다. 하나의 파일에, 행렬 입력값 A를 인수로 받는 진입점 함수 mySort를 작성합니다. gpucoder.sort 함수를 사용하여 A의 열을 내림차순으로 정렬합니다.

function B = mySort(A)
     B = gpucoder.sort(A, 1, 'descend');
end

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

codegen -config coder.gpuConfig('mex') -args {ones(1024,1024,'double')} -report mySort

생성된 CUDA 코드

다음은 생성된 코드의 일부(코드 조각)입니다. Thrust 라이브러리 호출은 thrustSortImpl로 표시됩니다.

...
cudaMalloc(&gpu_inDims, 8ULL);
cudaMalloc(&gpu_B, 8388608ULL);
cudaMalloc(&gpu_A, 8388608ULL);
mySort_kernel1<<<dim3(1U, 1U, 1U), dim3(32U, 1U, 1U)>>>(*gpu_inDims);
cudaMemcpy(gpu_A, (void *)&A[0], 8388608ULL, cudaMemcpyHostToDevice);
mySort_kernel2<<<dim3(2048U, 1U, 1U), dim3(512U, 1U, 1U)>>>(*gpu_A, *gpu_B);
cudaMemcpy(&inDims[0], gpu_inDims, 8ULL, cudaMemcpyDeviceToHost);
thrustSortImpl(&(*gpu_B)[0], 2, &inDims[0], 1, 'd', false);
cudaMemcpy(&B[0], gpu_B, 8388608ULL, cudaMemcpyDeviceToHost);
...