メインコンテンツ

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

stencilfun

ステンシル関数の CUDA コードの生成

R2022b 以降

    説明

    [OUT_1,...,OUT_N] = stencilfun(func,X,W) は、入力配列 X のサイズ W の各スライディング ウィンドウに関数 func を適用します。stencilfun は、func の出力数と数が同じでサイズが等しい出力配列を出力します。func の呼び出しごとに、対応する出力配列の単一要素が計算されます。この要素のインデックスは、入力配列のスライディング ウィンドウの中心に対応します。

    ___ = stencilfun(___,Name,Value) は、1 つ以上の Name,Value ペアの引数で指定されたオプションを使用することにより、ステンシル演算を実行します。

    すべて折りたたむ

    この例では、関数 stencilfun を使用して、5 行 5 列のフィルターで配列の 2 次元畳み込みを実行する方法を示します。

    MATLAB® エントリポイント関数を定義します。

    function Out = myconv(In, W)
    fh = @(X) stencilFcn(X, W);
    Out = stencilfun(fh, In, [5 5], Shape = 'same');
    end
    

    ステンシル関数 stencilFcn は次のように定義されます。

    function y = stencilFcn(X, W)
    y = 0;
    for j = 1:5
        for i = 1:5
            y = y + X(i,j) * W(i,j);
        end
    end
    end
    

    codegen コマンドを使用して CUDA® コードを生成します。

    入力引数

    すべて折りたたむ

    入力配列の要素に適用する関数。関数ハンドルとして指定します。func は次の形式を取らなければなりません。

    [Y_1, ..., Y_N] = FUNC(X1, IDX_1, ..., IDX_M);
    
    X1 は、サイズ WX の部分配列を示します。X1 に対応するスライディング ウィンドウが X の境界の外側にまたがる可能性があります。この場合、X1 は必要に応じて定数値で埋められます。各パラメーター IDX_K は、現在計算されている出力要素の次元 K に沿ったインデックスを示し、型は int32 です。func は任意の数の IDX 値を受け入れることができますが、この数は固定サイズでなければなりません。各パラメーター Y_K は、サポートされているデータ型のスカラー値でなければなりません。これは、K 番目の出力配列に対応する単一の出力要素を計算するものです。値 Y_K の型は、配列 OUT_K の型によって決まります。func は無名関数または入れ子関数にできます。この場合、func は、func が定義されているスコープ内にある追加の変数を参照できます。この動作は、ステンシル演算で入力ウィンドウに加えて追加のパラメーターが必要な場合に役立ちます。

    例: out = stencilfun(fh, X, [5 5]);

    データ型: function_handle

    X は、サポートされているデータ型の配列でなければなりません。

    例: out = stencilfun(fh, In, [5 5]);

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

    W は数値行ベクトルでなければなりません。ここで、W(D) は次元 D に沿ってウィンドウ サイズを指定します。入力配列と入力ウィンドウの次元は任意であり、同じである必要はありません。

    例: out = stencilfun(fh, In, [5 5], Shape = 'same');

    名前と値の引数

    すべて折りたたむ

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

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

    例: out = stencilfun(fh, In, [5 5], Shape = 'same');

    入力の各次元に適用されるパディングの量を決定することで、各出力配列のサイズを指定します。'Shape' は、次の値のいずれかとして指定しなければなりません。

    • 'full' — 各スライディング ウィンドウが、パディングされていない入力配列の少なくとも 1 つの要素にアクセスするように、パディングを入力配列に最大限適用します。

    • 'same' — 出力配列と入力配列が同じサイズになるように、入力配列をパディングします (ストライドが使用されていないと仮定します)。

    • 'valid' — 入力配列をパディングしません。

    例: out = stencilfun(fh, In, [5 5], Shape = 'same');

    ステンシル計算を実行する前に入力配列のすべての要素 (パディング要素を含む) に適用する前処理関数を指定します。'Preprocess' は、次の形式の関数ハンドルでなければなりません。

    Y = preprocess(X);
    
    ここで、X は入力要素を表し、Y は前処理された結果を表します。既定では、前処理は適用されません。

    例: out = stencilfun(fh, In, [5 5], Preprocess = @(x) single(3.14*x));

    各次元でウィンドウをスライドするときに、入力配列を走査するためのステップ サイズを指定します。'Stride' は数値スカラーまたは行ベクトルでなければなりません。'Stride' がスカラーの場合、その値は各次元のストライドを指定します。'Stride' がベクトルの場合、Stride(D) は次元 D に沿ってストライドを指定します。'Stride' の既定値は 1 です。

    例: out = stencilfun(fh, In, [5 5], Stride = 2);

    入力配列のパディングに使用する値を指定します。'PaddingValue' は入力配列と同じクラスでなければなりません。'PaddingValue' の既定値は 0 です。

    例: out = stencilfun(fh, In, [5 5], PaddingValue = 1);

    出力引数

    すべて折りたたむ

    出力の数は、func の出力の数と同じです。すべての出力配列は同じサイズです。

    ヒント

    • コールバック関数 func 内では sum などのツールボックス関数を使用しないことをお勧めします。ウィンドウの要素を反復処理するときは、代わりに明示的なループを使用する必要があります。

    • コールバック関数 func のウィンドウ パラメーターにインデックスを付ける際、各インデックス操作はウィンドウの単一の要素にのみアクセスしなければなりません。線形インデックスはサポートされていません。

    • コールバックは常に coder.inline('always') を使用してインライン化しなければなりません。

    • コールバック内ではウィンドウ パラメーターを変更しないでください。

    バージョン履歴

    R2022b で導入