カ,ネル解析
Gpuコ,ド生成では,cuda®カ,ネルを作成するための基本となるメカニズムは为
ル,プを使用することです。MATLAB®コード内でのループの書き方は,作成されるカーネル数と,生成コードのパフォーマンスに大きく影響します。Gpuコ,ドを生成する場合,診断レポ,トをチェックし,ル,プセグメントに循环没有并行化
という注意が表示されているかどうかを確認します。コ,ド内のmatlab関数への呼び出しにも,これらの注意が含まれる为
ル,プがある可能性があります。パフォ,マンスを最大化するには、コード内の計算量の多いループ セグメントがカーネルにマッピングされ、並列に実行されていることを確認する必要があります。以降の推奨事項は、この目標を達成し、効率的な CUDA カーネルを生成するのに役立ちます。
カ,ネルに対する入れ子にされたル,プのマッピング
条件
入れ子にされた为
ルプを含む関数にいて考えます。
函数Y = foo(x)...为i1 = 1:N1为i2 = 1:N2为i3 = 1:N3为i4 = 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を使用して,サポ,トされない関数を書き換えてみます。
ル,プの交換
条件
ループの入れ子内で比較的小さいループが最も外側のループになっている場合,その入れ子に含まれているループの一部のみでカーネルが作成される可能性があります。アルゴリズムで許容される場合,常に最も外側の入れ子に最も大きなル,プを配置してください。
操作
より大きなル,プをより外側のル,プにしてル,プの入れ子を書き換えます。