2

10 個の計算ユニットと 32k のローカル メモリを備えた HD5770 を使用しています。

グローバル サイズは 256 * 256、
ローカル サイズは 256

各ワークグループは、次のように指定している 1k のローカル メモリを使用する必要があります。

clSetKernelArg(predicate, param++, 1024, NULL);

最初に:これはローカル メモリを割り当てる正しい方法ですか、それとも、ローカル ID に応じてカーネル arg を設定し、後でこのバッファにインデックスを設定するときに、すべてのワークグループが一緒に使用するバッファのサイズ全体を指定する必要がありますか?

2 つ目: 1 つのワークグループは 1 つのコンピューティング ユニットだけで実行されますか?

3 番目:ワークグループが終了した後、メモリは解放されますか? (それぞれが 1k を使用する場合、256 のワークグループには 32k では十分ではありません)

または、より一般的な方法: スケジューラは、32 を超えるワークグループを並行してスケジュールしないように処理しますか?

ありがとうございました!

4

1 に答える 1

2

1)これは、初期化されていないローカルメモリの1024バイトを割り当てる方法です。したがって、それが必要な場合は、はい、正しく行っています。次のように、カーネル内のメモリを定義することもできます。

__local float localBuffer[1024];

2)これは実装定義であるため、知る方法がなく、それを想定することはできません。通常、ワークグループは複数のコンピューティング ユニットで実行されますが、前述したように、実際にはわかりません。

3) メモリは次回使用時に上書きされるため、解放について心配する必要はありません。特に初期化されておらず、バッファを渡していないためです。

お役に立てれば

于 2013-02-17T12:28:03.443 に答える