Main Content

gpucoder.sort

MATLAB 関数 sort の最適化された GPU 実装

説明

B = gpucoder.sort(A)A の要素を昇順に並べ替えます。並べ替え操作は Thrust ライブラリを使用して GPU で実行されます。Thrust は CUDA® 用の C++ テンプレート ライブラリで、CUDA Toolkit に付属しています。B の並べ替えられた出力の型とサイズは A と同じになります。A がベクトルの場合、gpucoder.sort(A) は A の要素を昇順に並べ替えます。A が行列の場合、gpucoder.sort(A) は A の各列を昇順に並べ替えます。A が N 次元配列の場合、gpucoder.sort(A) は大きさが 1 でない最初の次元に沿って並べ替えます。

B = gpucoder.sort(A,dim) のオプション引数 dim は、並べ替え操作を実行するときに沿う次元を指定します。

B = gpucoder.sort(A,direction) のオプション引数 direction は、並べ替えの方向を指定します。direction は次の 2 つのいずれかの値をとることができます。

  • 'ascend' - 昇順に並べ替えます。これは既定のオプションです。

  • 'descend' - 降順に並べ替えます。

[B,I] = gpucoder.sort(A,...) は、並べ替え後の出力 B を取得するために A の要素が再配置された方法を指定する並べ替えインデックス I を返します。

  • A がベクトルである場合、B = A(I) になります。

  • A が m 行 n 列の行列で、dim = 1 である場合、以下になります。

    for j = 1:n
      B(:,j) = A(I(:,j),j);
    end

この並べ替えの順序は安定しています。つまり、複数の要素の値が同じである場合、並べ替えられた出力 B では同等の要素の順序が維持され、同等の要素に関するインデックス I は昇順になります。

gpucoder.sort が MATLAB® から呼び出された場合、組み込み関数 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

以下は、生成コードのスニペットです。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);
...

入力引数

すべて折りたたむ

入力配列。ベクトル、行列、または多次元配列として指定します。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char

動作する対象の次元。正の整数スカラーとして指定します。値を指定しない場合、既定値は、サイズが 1 ではない最初の配列の次元です。

dimndims(A) より大きい場合、sortA を返します。A が cell 配列の場合、dim はサポートされないため、sort は、サイズが 1 でない最初の配列の次元のみに沿って動作します。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

並べ替える方向。'ascend' または 'descend' として指定します。A が cell 配列の場合、direction はサポートされないため、sort は昇順でのみ並べ替えを実行します。

出力引数

すべて折りたたむ

並べ替えられた配列。ベクトル、行列、または多次元配列として返されます。B のサイズと型は A と同じです。B 内の要素の順序は、A 内の等しい要素の順序を維持します。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char

並べ替えインデックス。ベクトル、行列、または多次元配列として返されます。I のサイズは A と同じです。インデックス ベクトルは sort が作用する次元に沿って方向付けされます。たとえば、A が 2 行 3 列の行列である場合、[B,I] = sort(A,2)A の各行の要素を並べ替えます。出力 I は 1 行 3 列の行インデックス ベクトルの集合で、A の各行の並べ替えを表しています。

制限

  • gpucoder.sort は、複素数をサポートしていません。

  • gpucoder.sort は、MATLAB 関数 sort でサポートされる 'MissingPlacement' および 'ComparisonMethod' の名前と値のペアをサポートしていません。

バージョン履歴

R2018b で導入