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); ...