私は OpenCL カーネルを持っており、さまざまなシステムで検出されたすべての OpenCL 対応デバイス (利用可能なすべての GPU など) で実行したいと考えています。簡単な方法があれば教えていただければ幸いです。つまり、すべてのデバイスに対して単一のコマンド キューを作成するようなものです。
前もって感謝します :]
私は OpenCL カーネルを持っており、さまざまなシステムで検出されたすべての OpenCL 対応デバイス (利用可能なすべての GPU など) で実行したいと考えています。簡単な方法があれば教えていただければ幸いです。つまり、すべてのデバイスに対して単一のコマンド キューを作成するようなものです。
前もって感謝します :]
すべてのデバイスに対して単一のコマンド キューを作成することはできません。特定のコマンド キューは、1 つのデバイスに関連付けられています。ただし、OpenCL デバイスごとに個別のコマンド キューを作成し、同時に実行する必要がある作業をフィードすることができます。
Dithermaster が指摘しているように、最初にデバイスごとに個別のコマンド キューを作成します。たとえば、複数の GPU がある場合があります。次に、これらを配列に配置できます。たとえば、設定できる配列へのポインターを次に示します。
cl_command_queue* commandQueues;
ただし、私の経験では、さまざまなコマンド キューを同時に実行することは必ずしも「スラムダンク」ではありませんでした。これは、独自のプロファイリングまたはサード パーティのプロファイリングを使用して取得できるイベント タイミング情報 (オーバーラップのチェック) を使用して確認できます。ツール。とにかくこの手順を実行して、セットアップで何が機能し、何が機能しないかを確認する必要があります。
非常にうまく機能する代替アプローチは、OpenMP を使用してコマンド キューを同時に実行することです。たとえば、次のようにします。
#pragma omp parallel for default(shared)
for (int i = 0; i < numDevices; ++i) {
someOpenCLFunction(commandQueues[i], ....);
}