Main Content

coder.gpu.kernelfun

関数を GPU カーネルにマッピングするプラグマ

説明

coder.gpu.kernelfun() は、それが配置されている関数内のすべての計算を GPU にマッピングしようとするグローバル レベルのプラグマです。この関数内のループが GPU カーネルに並列化されるのは、並列ループ解析チェックをパスした場合のみです。この解析は、すべてのループ反復が互いに依存していないことを証明しようとします。さらに、コード ジェネレーターは、反復回数が少ないループや最小限の計算を実行するループなどの単純なループに対しては GPU カーネルを作成しません。このようなループを並列化すると、カーネルの作成や GPU と CPU の間のメモリ転送のオーバーヘッドにより、コードのパフォーマンスが低下する可能性があります。

kernelfun プラグマに入力パラメーターは必要ありません。生成されるカーネルの次元は、ループ パラメーターに基づいて自動的に計算されます。

この関数はコード生成関数です。MATLAB® では効果がありません。

すべて折りたたむ

この例では、kernelfun プラグマを関数で使用し、CUDA® コードを生成する方法について説明します。

1 つのファイル内に、サイズ 1x4096 の 2 つのベクトル入力 x,y と、1 つのスカラー入力 scale を受け入れるエントリポイント関数 scalars を記述します。この関数には反復の長さが異なる 2 つの for ループがあります。1 つはベクトル加算用で、1 つは累積和を求めるためのループです。coder.gpu.kernelfun() プラグマを関数 scalars 内に配置します。

function [vout, sout1] = scalars(x,y,scale)
    coder.gpu.kernelfun;
    sout1 = 0;
    vout = coder.nullcopy(zeros(1,1024));
    
    for i=1:1024
        vout(i) = x(i) + y(i);
    end

    for i=1:4096
        sout1 = (x(i)*scale) + sout1;    
    end
end

関数 codegen を使用して CUDA MEX 関数を生成します。

codegen -config coder.gpuConfig('mex')...
 -args {ones(1,4096,'double'),ones(1,4096,'double'),coder.typeof(0)}...
 -report scalars

GPU Coder により、ベクトルの加算用と累積和用のカーネルが作成されます。

  scalars_kernel1<<<dim3(8U, 1U, 1U), dim3(128U, 1U, 1U)>>>(*gpu_y, *gpu_x,
                                                            *gpu_vout);
  scalars_kernel2<<<dim3(4U, 1U, 1U), dim3(1024U, 1U, 1U)>>>(scale, *gpu_x,
                                                             gpu_sout1);

ベクトル加算用のカーネルには、各要素を加算するためのスレッドが 1 つずつ、合計 1024 個あります。同様に、累積和用のカーネルには合計 4096 個のスレッドがあります。

バージョン履歴

R2017b で導入