0

私は OpenCL カーネルを持っており、さまざまなシステムで検出されたすべての OpenCL 対応デバイス (利用可能なすべての GPU など) で実行したいと考えています。簡単な方法があれば教えていただければ幸いです。つまり、すべてのデバイスに対して単一のコマンド キューを作成するようなものです。

前もって感謝します :]

4

3 に答える 3

3

すべてのデバイスに対して単一のコマンド キューを作成することはできません。特定のコマンド キューは、1 つのデバイスに関連付けられています。ただし、OpenCL デバイスごとに個別のコマンド キューを作成し、同時に実行する必要がある作業をフィードすることができます。

于 2013-11-11T02:21:38.467 に答える
2

Dithermaster が指摘しているように、最初にデバイスごとに個別のコマンド キューを作成します。たとえば、複数の GPU がある場合があります。次に、これらを配列に配置できます。たとえば、設定できる配列へのポインターを次に示します。

cl_command_queue* commandQueues;

ただし、私の経験では、さまざまなコマンド キューを同時に実行することは必ずしも「スラムダンク」ではありませんでした。これは、独自のプロファイリングまたはサード パーティのプロファイリングを使用して取得できるイベント タイミング情報 (オーバーラップのチェック) を使用して確認できます。ツール。とにかくこの手順を実行して、セットアップで何が機能し、何が機能しないかを確認する必要があります。

非常にうまく機能する代替アプローチは、OpenMP を使用してコマンド キューを同時に実行することです。たとえば、次のようにします。

#pragma omp parallel for default(shared)
    for (int i = 0; i < numDevices; ++i) {
            someOpenCLFunction(commandQueues[i], ....);
    }
于 2013-11-11T03:50:34.937 に答える