Main Content

Thrust の例

GPU Coder™ では Thrust ライブラリがサポートされており、複雑かつ高性能な並列化アプリケーションを実装するために、sort など、GPU により高速化されたプリミティブを活用できます。MATLAB® コードで sort の代わりに関数 gpucoder.sort を使用している場合、GPU Coder は Thrust の sort プリミティブの呼び出しを生成できます。

この例では、行列の列を降順に並べ替えるための CUDA® コードを生成します。1 つのファイル内に、行列入力 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);
...