メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

gpucoder.reduce

リダクション演算ための GPU 実装の最適化

説明

S = gpucoder.reduce(A,FUN) は、関数ハンドル FUN を使用して、入力配列 A 内の値を単一値に集計します。出力 S はスカラーです。

S = gpucoder.reduce(A,{@FUN1,@FUN2,...}) は、cell 配列で提供されたすべての関数ハンドルを使用して、入力配列内の値を単一値に集計します。出力のサイズは 1 行 N 列です。ここで、N は関数ハンドルの数です。

コード ジェネレーターは、shuffle 内部パラメーターを使用し、GPU でリダクション演算を実行します。この関数は、GPU の単一のカーネル内で複数の関数ハンドルを集計します。

S = gpucoder.reduce(___,Name=Value) は、1 つ以上の名前と値の引数で指定されたオプションを使用して、入力配列内の値を集計します。

すべて折りたたむ

この例では、配列の最小値と、指定されたしきい値より大きい要素の和を求める CUDA® コードを生成します。

行列入力 A、次元 dim、およびしきい値 threshold を受け入れる、multireduce という名前のエントリポイント関数を記述します。gpucoder.reduce 関数を使用し、次元 dim に沿って A の要素に対して 2 種類のリダクション演算を実行します。

function [s1, s2] = multireduce(A, dim, threshold) %codegen
    fh1 = @min;
    fh2 = @(a,b) a*(a > threshold) + b*(b > threshold);
    [s1, s2] = gpucoder.reduce(A, {fh1, fh2}, "dim", dim);
end

入力行列に対して 32 行 32 列の配列、次元に対して定数値 2、しきい値に対してスカラー値として入力引数を指定します。codegen コマンドを実行して、CUDA MEX 関数 multireduce_mex を生成します。

inputArgs = {rand(32, 32, "double"), coder.Constant(2), 0.5};
cfg = coder.gpuConfig('mex');
codegen -config cfg -args inputArgs multireduce -report

2 番目の引数に定数入力値 2 を、3 番目の引数に入力値 0.5 を指定して、multireduce_mex を呼び出します。

[s1, s2] = multireduce_mex(rand(32), 2, 0.5); 

入力引数

すべて折りたたむ

入力配列。ベクトル、行列、または配列として指定します。コード生成では、入力配列は数値型または logical データ型でなければなりません。

ユーザー定義関数。名前付き関数または無名関数のハンドルとして指定します。関数ハンドルは二項関数であり、以下でなければなりません。

  • 2 つの入力を受け入れ、1 つの出力を返す。関数への入力と出力のタイプは入力配列 A と一致しなければなりません。

  • 可換的かつ結合的である。

FUN が無名である場合、その関数を定義するスコープ内に存在する変数は参照可能です。FUN への 2 つの入力引数に加えて、それらの変数をリダクション関数で使用できます。

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: gpucoder.reduce(A, {@min, @max}, dim=2);

削減対象次元。正の整数スカラーとして指定します。

例: gpucoder.reduce(A, {@min, @max}, dim=2);

前処理関数。名前付き関数または無名関数のハンドルとして指定します。既定では、gpucoder.reduce は入力配列を前処理しません。

preprocess 関数ハンドルが無名である場合、その関数を定義するスコープ内に存在する変数は参照可能です。入力配列だけでなくそれらの変数も参照する前処理関数を作成できます。

例: gpucoder.reduce(A,@min, preprocess=@myScale);

出力引数

すべて折りたたむ

リダクション演算の結果。スカラー、ベクトル、または行列として返されます。削減の際、関数は S を入力配列 A のいずれかの要素の値に初期化します。次に、S は表内のアクションを実行します。

A の形状関数ハンドルの数入力引数 dim出力 S
ベクトル1指定なしS はスカラー。
ベクトルN指定なしS は 1 行 N 列のベクトル。
行列1指定あり関数は、次元 dim に沿ってリダクション演算 FUNA に適用する。たとえば、size(A) = [8 16 32] かつ dim = 2 の場合、size(S) = [8 1 32] となる。
行列N指定あり 関数は、次元 dim に沿って各関数ハンドルを A に適用する。たとえば、size(A) = [8 16 32]dim = 2、関数ハンドルの数が N の場合、
[s1, s2, … sN] = gpucoder.reduce(___) および size(s1) = [8 1 32] となる。

制限

  • gpucoder.reduce は複素数配列の縮小をサポートしません。

  • ユーザー定義関数は 2 つの入力を受け入れ、1 つの出力を返さなければなりません。入力と出力のデータ型は、前処理された入力配列のデータ型と一致しなければなりません。

  • ユーザー定義関数は可換的かつ結合的でなければなりません。それ以外の場合、関数の動作は定義されません。

  • コード生成では、gpucoder.reduce は出力データ型のサイズに基づいて、限られた数のユーザー定義関数ハンドルを受け入れます。たとえば、half データ型を出力する関数ハンドルは最大 46 個、double データ型を出力する関数ハンドルは最大 11 個入力できます。入力する関数ハンドルの数が多すぎる場合、コード生成でエラーが発生します。

  • 入力が整数データ型である場合、生成コードで中間計算が飽和する可能性があります。この場合、生成コードから得られる結果は MATLAB® のシミュレーション結果と一致しない場合があります。

バージョン履歴

R2019b で導入

すべて展開する