34

コンピューターに複数の CUDA 対応 GPU がある場合、各 GPU にはdevice ID. デフォルトでは、CUDA カーネルは で実行されdevice ID 0ます。を使用cudaSetDevice(int device)して別のデバイスを選択できます。

マシンに GTX 480 と GTX 670 の 2 つの GPUがあるとします。CUDA は、どの GPU がどの GPU であるかをどのように判断しますか?device ID 0device ID 1


CUDA がデバイス ID を割り当てる方法のアイデア (ブレインストーミングのみ):

  • 計算能力の降順
  • PCI スロット番号
  • デバイスがシステムに追加された日時 (コンピュータに追加されたばかりのデバイスの ID 番号が大きい)

動機: 私はいくつかの HPC アルゴリズムに取り組んでおり、いくつかの GPU に対してそれらのベンチマークと自動調整を行っています。私のプロセッサには、フル帯域幅で cudaMemcpys を 3 つの GPU に駆動するのに十分な PCIe レーンがあります。そのため、GPU を常にマシンに出し入れする代わりに、コンピューターに 3 つの GPU を保持することを計画しています。コンピューターに GPU を追加または交換したときに何が起こるかを予測できるようにしたいと考えています。

4

4 に答える 4

23

CUDAは最速のデバイスをデバイス0として選択します。したがって、GPUをスワップインおよびスワップアウトすると、順序が完全に変わる可能性があります。以下を使用して、PCIバスIDに基づいてGPUを選択する方がよい場合があります。

cudaError_t cudaDeviceGetByPCIBusId ( int* device, char* pciBusId )
   Returns a handle to a compute device.

cudaError_t cudaDeviceGetPCIBusId ( char* pciBusId, int  len, int  device )
   Returns a PCI Bus Id string for the device.

またはCUDAドライバーAPI cuDeviceGetByPCIBusId cuDeviceGetPCIBusId

しかし、IMOは、 NVMLまたはnvidia-smiを使用して各デバイスの一意の識別子(UUID)を取得しnvmlDeviceGetUUID、それを使用してCUDAデバイスとpciBusIdを照合することで、どのデバイスがどれであるかを知る最も信頼できる方法nvmlDeviceGetPciInfoです。

于 2012-12-09T08:21:08.967 に答える
5

CUDAサポート/GPUの選択は、それを示唆しています

複数の GPU を搭載したマシンで CUDA プログラムを実行する場合、デフォルトでは、プライマリ グラフィックス カード スロットにインストールされている GPU で CUDA カーネルが実行されます。

また、「GPU が選択されていない、コードが適切に機能している」での議論では、これはどのように可能ですか? 一般に、CUDA は「最適な」カードをデバイス 0 にマップしないことを示唆しています。

編集

今日、計算用のTesla C2050カードと視覚化用の8084 GSカードを搭載したPCをインストールし、最初の2つのPCI-Eスロット間で位置を切り替えました。私は deviceQuery を使用しましたが、GPU0は常に最初の PCI スロットにあり、GPU1は常に 2 番目の PCI スロットにあることに気付きました。これが一般論かどうかはわかりませんが、私のシステムでは、GPU が「パワー」ではなく位置に応じて番号付けされていることを証明しています。

于 2013-09-09T10:36:54.857 に答える