16

PCI ID で識別されるマルチ GPU システム上のシステムで、OpenCL デバイスを GPU と一致させたいと考えています。

たとえば、システムに複数の GPU (おそらく異なるベンダー製) がある場合、PCI バスを列挙することでデバイスを一覧表示できます。これにより、PCI ベンダー、デバイス、およびバス ID が得られます。いくつかの選択基準に基づいて OpenCL 計算に使用するこれらの (GPU) PCI デバイスの 1 つを選択した場合、それを OpenCL デバイスに一致させるにはどうすればよいですか?

clGetDeviceIDs()を使用して OpenCL で GPU デバイスを列挙できますが、OpenCL デバイスを PCI デバイスに一致させる明らかな方法はありません。OpenCL 関数clGetDeviceInfo()は、PCI ベンダー ID とデバイス名へのアクセスを提供しますが、PCI デバイスまたはバス ID へのアクセスは提供しません。PCI デバイス名と OpenCL デバイス名を一致させることはできますが、同じタイプのデバイスが複数ある可能性があり、名前が常に同じであるとは限りません。

なぜこれが必要なのですか?プログラム X が GPU A で CUDA などを実行していることを知っているとします。OpenCL 操作に GPU A も使用することを避けたいので、GPU B を選択します。次に、どの OpenCL デバイスが GPU A で、どれが GPU であるかを把握する必要があります。 B. PCI ID は、GPU デバイスを識別する唯一の一貫したクロス プラットフォームの方法のようです。

ところで、CUDA API は PCI、バス、およびスロット ID (CU_DEVICE_ATTRIBUTE_PCI_BUS_ID、CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID) を提供しますが、CUDA は NVidia デバイスでのみ動作します。

理想的には、C または C++ を使用したソリューションが必要です。

4

5 に答える 5

0

私はまさにそれを行うためのライブラリを開発しました:OpenCLシミュレーションがお互いのつま先を踏まないようにします。

ここにあります:https ://github.com/nbigaouette/oclutils/

最初に、マシン上に存在する各プラットフォームのすべてのプラットフォームとすべてのデバイスを列挙します。必要なプラットフォームを選択すると、利用可能な最適なデバイスが選択されます。ワークステーションで3枚のnvidiaカードを使用しています。OpenCL計算用に2枚のGTX580、ディスプレイ用に1枚のGT210です。2つのシミュレーションを同時に実行すると、2つのGTXで別々に実行されます。介入なし。

2つのバッファの同期を維持する優れたクラスもあります。1つはホスト上に、もう1つはデバイス上にあります。OpenCL_Array :: Host_to_Device()およびOpenCL_Array :: Device_to_Host()を呼び出すと、転送が簡単になります。

これらのプラットフォームで動作します。

  • nvidia(GPUのみ)
  • amd(CPUおよび/またはGPU)
  • Intel(CPUのみ)
  • アップル(CPUおよび/またはGPU)

使用するデバイスを選択することはできませんが、デバイスを選択してください。プログラムの2つのインスタンスがライブラリを使用する場合、それらはライブラリを認識し、同じデバイス上で実行されません(もちろん、ライブラリを使用している場合)。また、現在、ビデオカードがディスプレイに使用されているかどうかを検出することもできません。しかし、少なくともそれは始まりです!

于 2011-11-22T01:15:44.147 に答える
0

最新の AMD リリースには、Linux の cl_device_topology_amd 拡張機能があり、clGetDeviceInfo() に CL_DEVICE_TOPOLOGY_AMD オプションが追加されていますが、これはかなり限定的なソリューションです。

于 2011-09-08T00:34:47.837 に答える