7

1つのシステムで2つのOpenCLランタイムを一緒に使用したい(私の場合はAMDとNvidiaですが、質問はかなり一般的です)。

プログラムを任意のSDKでコンパイルできることを知っています。しかし、プログラムを実行するときは、libOpenCL.soを提供する必要があります。OpenCLプログラムに3つのデバイス(AMD CPU、AMD GPU、Nvidia GPU)が表示されるように、両方のランタイムのライブラリを提供するにはどうすればよいですか?

どういうわけか可能であるに違いないことは知っていますが、Linuxでそれを行う方法についての説明はまだ見つかりませんでした。

どうもありがとう、トーマス

4

4 に答える 4

6

あなたはそれを正しく考えていません。SDKはアプリケーションによって提供されないため、コンパイルされたプログラムを実行するために必要ありません。OpenCLランタイムはクライアントシステムによって提供され、それがプログラムプラットフォームとデバイスをとで使用できるようにclGetPlatformIDsclGetDeviceIDsます。

ユーザーがNvidiaグラフィックカードを持っていない場合、ユーザーはNvidia OpenCLランタイムまたはハードウェアを持っていないため、システムでNvidiaプラットフォームとデバイスを使用できなくなります。

さまざまなOpenCLSDKが提供するすべてのベンダー固有の拡張機能は、ベンダーランタイムによって理解されます。

于 2013-02-12T14:21:58.240 に答える
5

Khronos OpenCLワーキンググループは、複数のベンダードライバーをシステムにインストールできるようにするICDレイヤー(インストール可能なクライアントドライバー)を定義しました。アプリケーションは、ICDレイヤーを介してベンダードライバーにアクセスします。詳細については、cl_khr_icd.txtを参照してください。

于 2013-02-16T17:48:34.343 に答える
4

スミスとトーマスの答えは正しいです。これはその情報を拡張したものです。OpenCLプラットフォームを列挙すると、インストールされているドライバーごとに1つ取得されます。各プラットフォーム内で、デバイスを列挙します。AMDおよびIntelドライバーもCPUデバイスを公開します。したがって、完全に実装されたマシンでは、AMDプラットフォーム(CPUおよびGPUデバイスを使用)、NVIDIAプラットフォーム(GPUデバイスを使用)、およびIntelプラットフォーム(CPUおよびGPUデバイスを使用)が表示される場合があります。コードは、使用するデバイスにコンテキストを作成し、それらをフィードするための1つ以上のコマンドキューが機能します。それらすべてを忙しくして作業を続けることができますが、同じプラットフォームのデバイス間でのみデータバッファーを共有できます。プラットフォーム間でデータを共有するには、その間のCPUメモリにヒットする必要があります。

于 2013-02-17T02:41:01.167 に答える
2

同時に複数のOpenCLデバイスで実行することに関して。複数のデバイスで実行する場合は、デバイス/ベンダーごとに個別のコンテキストを作成し、それぞれを個別のスレッドで実行します。たとえば、GTX590があります。これは2つのGTX590デバイスとして表示されます。Inteli7プロセッサも持っています。3つのコンテキストを作成します。2つは590デバイス用、もう1つはCPU用で、SDL_CreateThreadを使用して3つのスレッドで各コンテキスト/デバイスを実行します(pthreadも同様に機能します)。良い結果を得るには、各デバイスのジョブ数を「速度」に比例して重み付けする必要があります。たとえば、各GTX 590で45%、CPUで10%です。使用するのに最適な重みは、アプリケーションによって異なります。

于 2013-03-09T19:46:02.523 に答える