4.3.4.2. 低い占有率
占有率が低いということは、Work-Itemがロードおよびストア動作またはチャネルをまれにアクセスしていることを意味します。 この動作は、ロードおよびストア動作、またはクリティカルでないループにあるチャネルで発生します。しかし、メモリーまたはチャネル命令がカーネルコードの重要な部分にあり、占有率または活動率が低い場合、ハードウェアでWork-Itemまたはループ反復が発行されていないため、パフォーマンスのボトルネックが存在することを意味します。
次の式を検討してみましょう。
__kernel void proc (__global int * a, ...) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < 1000; j++) {
write_channel_intel (c0, data0);
}
for (int k = 0; k < 3; k++) {
write_channel_intel (c1, data1);
}
}
}
すべてのループがパイプライン化されていると仮定すると、トリップカウントが1000の最初の内部ループがクリティカルループです。トリップカウントが3の2番目の内部ループは頻繁に実行されません。その結果、チャネルc0の占有率およびアクティビティーパーセンテージが高く、チャネルc1の占有率およびアクティビティーの割合が低いことが期待できます。
また、小さなワーク・グループ・サイズを定義すると、占有率が低くなる可能性があり、カーネルが十分なWork-Itemを受け取らない可能性があります。これは問題があります。なぜなら、一般にカーネルの実行中にパイプラインが空であり、パフォーマンスが低下するからです。