2013-02-12 24 views
6

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

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

私はそれが何とか可能でなければならないことを知っていますが、私はまだLinuxのためにそれを行う方法についての説明は見つかりませんでした。

どうもありがとう、あなたは右のそれを考えていない トーマス

+0

同じ機能をエクスポートする2つのライブラリをロードすることはできませんが、別のライブラリをロードするたびに同じアプリケーションを2回実行することができます: LD_LIBRARY_PATH =/usr/lib64/OpenCL/vendors/intel; ./app_to_run LD_LIBRARY_PATH =/usr/lib64/OpenCL/vendors/amd; ./app_to_run これはあなたが望むものですか? – Sacx

+0

クール、それは1つの解決策になります。しかし、私は本当に1つのアプリケーションでそれを使用したい。あなたのソリューションでは、ランタイムごとに2つのアプリケーションを起動して、アプリを何らかの方法で1つのプログラムで両方のランタイムを使用するように接続する必要があります...もっと簡単な方法があることを本当に願っています!! – Tomas

答えて

4

スミスとトーマスの回答は正しいです。 OpenCLプラットフォームを列挙すると、インストールされているドライバごとに1つずつ取得されます。各プラットフォーム内で、デバイスを列挙します。 AMDとIntelドライバは、CPUデバイスも公開しています。だから完全搭載されたマシンでは、AMDプラットフォーム(CPUとGPUデバイスを含む)、NVIDIAプラットフォーム(GPUデバイスを搭載)、およびIntelプラットフォーム(CPUとGPUデバイスを含む)を見ることができます。あなたのコードは、使用したいデバイスと、それを供給するための1つ以上のコマンドキューにコンテキストを作成します。すべての作業を忙しくすることができますが、同じプラットフォームのデバイス間でのみデータバッファを共有できます。プラットフォーム間でデータを共有するには、その間にCPUメモリを確保する必要があります。

+0

最後の文では、2つの互換性のあるプラットフォームの間で、SLIバスが利用可能であれば、例えばSLIバスを介してデータを転送するベンダー拡張を想像することができます。しかし、一般的にはい、それはシステムメモリを経由する必要があるので、問題がきちんと独立したGPUに分割できない場合は、マルチGPUの計算が失敗するでしょう。 – Thomas

5

。 SDKはアプリケーションによって提供されておらず、は不要です。は、コンパイルされたプログラムを実行するためのものです。 OpenCL ランタイムは、クライアントシステムによって提供されており、これがclGetPlatformIDsclGetDeviceIDsで使用するプログラムプラットフォームとデバイスを提供しています。

ユーザーはNvidiaのグラフィックスカードを持っていない場合は、単には、彼はNvidiaのOpenCLのランタイムやハードウェアを持っていないので、自分のシステム上でNvidiaのプラットフォームとデバイスを使用できるようにするつもりはありません。

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

+0

はい、ターゲットプラットフォームにはAPU(AMDの統合GPU搭載CPU)とNvidia GPUがあります。私は同じプログラムの中で両方にアクセスしたいです。おそらく2つのプラットフォームIDがあり、そのうちの1つに2つのデバイスがあり、もう1つに1つのデバイスがあります。 – Tomas

+1

はい、OpenCL APIからプラットフォームと3つのデバイスの両方を取得するだけです。あなたは "SDK"にリンクする必要はありません、OpenCLはあなたがシステム上のすべてのインストールされたプラットフォームにアクセスできるようになります。より速く進むためにそれらを同時に使用したいと思っていますか?もしそうなら、それは完全に異なった質問で、あなたはマルチGPU計算をしたいと思っています。そうですか? – Thomas

+0

はい、私はOpenCLを使用して、マルチGPU + CPU計算を行いたいと思います。上記の私の質問のコメントで述べたように、LD_LIBRARY_PATHにlibOpenCL.soを指し示す必要があります。異なるベンダの2つのデバイスでは、2つのlibOpenCL.soがあります...問題は、両方のアプリケーションを1つのアプリケーションで使用する方法です。 – Tomas

4

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

+0

cl_khr_icd.txは非常によく説明しています。私はインターネットで長い時間を検索しますが、私は何も見つけられませんでしたが、このテキストファイルではシナリオ全体を理解しています。 –

2

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

関連する問題