主要内容

カ,ネル解析

Gpuコ,ド生成では,cuda®カ,ネルを作成するための基本となるメカニズムはル,プを使用することです。MATLAB®コード内でのループの書き方は,作成されるカーネル数と,生成コードのパフォーマンスに大きく影響します。Gpuコ,ドを生成する場合,診断レポ,トをチェックし,ル,プセグメントに循环没有并行化という注意が表示されているかどうかを確認します。コ,ド内のmatlab関数への呼び出しにも,これらの注意が含まれるル,プがある可能性があります。パフォ,マンスを最大化するには、コード内の計算量の多いループ セグメントがカーネルにマッピングされ、並列に実行されていることを確認する必要があります。以降の推奨事項は、この目標を達成し、効率的な CUDA カーネルを生成するのに役立ちます。

カ,ネルに対する入れ子にされたル,プのマッピング

条件

入れ子にされたルプを含む関数にいて考えます。

函数Y = foo(x)...i1 = 1:N1i2 = 1:N2i3 = 1:N3i4 = 1:N4...结束结束结束结束

中間ルプの1であるi3を並列化できないとします。ルプ解析を実行してカーネルを作成すると、GPU Coder™ では最も外側の並列ループi1、i2のみが考慮され,外側のル,プ次元N1、N2のカ,ネルが作成されます。ルプi3,预告はカ,ネル本体内にあり,逐次的に実行されます。ただし,最も内部の预告が大きい(反復である)場合,最も内部のループ用にカーネルを作成することで,より優れたパフォーマンスが達成される可能性があります。

操作

次の3の方法で,。

  • コ,ドを書き直し,最も内部のコ,ドセグメントが,入れ子にされたル,プ内に入らないようにします。

  • 外側のルプの反復サズが小さい場合,このルプを関数coder.unrollに追加します。この関数は,各ル,プ反復でル,プ本体のコピ,を作成することにより,ル,プを展開します。詳細にいては,coder.unrollを参照してください。

    函数Y = foo(x)...i1 = code .unroll(1:N1)...结束
  • 外側のル,プ次元を動的な範囲にします。このようにすると,外側のル,プでの並列ル,プ解析は失敗しますが,内側のル,プでは成功します。

    函数y = foo(x,N1)...i1 = 1:N1...结束

打破を含む为ル,プ

条件

打破を含むル,プはサポ,トされません。

(i < N)......如果(cond2)......打破结束结束

操作

ガド変数および条件を作成してbreakを削除します。

Cond = true;(我< N)如果(电导率)......如果(cond2) cond = false;结束结束结束

依存性解析の並列ル,プチェックの失敗

条件

カ,ネル抽出では並列ル,プの依存性解析が使用されます。ルプの依存性解析で並列 for ループを検出できない場合があります。coder.gpu.kernelは,GPU Coderで依存性解析をオバラドし,強制的にカネルを作成できるようにします。注意点として,ユーザーはそのループが反復間で依存関係を持たない“所有”ループであることを確認してください。

操作

各为ル,プに対して明示的にcoder.gpu.kernelプラグマを使用します。

配列の論理@ @ンデックス付け

条件

配列要素へのアクセスのために論理インデックスが使用されていない場合,GPU编码器ではカーネルが作成されない可能性があります。

I = (mag ~= 0);Vx (i) = Vx (i)./mag(i);Vy (i) = Vy (i)./mag(i);

操作

ル,プ本体を使用して適切な条件で保護することで,コ,ドを書き換えます。

I = 1:数值(mag)如果(mag(i) ~= 0) vx(i) = vx(i)./mag(i);Vy (i) = Vy (i)./mag(i);结束结束

サポ,トされない関数

条件

サポートされない関数,コーダープラグマ,ツールボックス関数などをループ内部で使用していると,カーネル化することができなくなります。

操作

純粋なmatlabを使用して,サポ,トされない関数を書き換えてみます。

ル,プの交換

条件

ループの入れ子内で比較的小さいループが最も外側のループになっている場合,その入れ子に含まれているループの一部のみでカーネルが作成される可能性があります。アルゴリズムで許容される場合,常に最も外側の入れ子に最も大きなル,プを配置してください。

操作

より大きなル,プをより外側のル,プにしてル,プの入れ子を書き換えます。

関連するトピック