web-dev-qa-db-ja.com

GPUはメインコンピュータRAM(拡張として)を使用できますか?

専用GPUを搭載したラップトップ、Nvidia Quadro P3200を持っています。 RAMは6 GBです。

ラップトップには、32 GBの「通常」(CPU?)RAMも搭載されています。

物理シミュレーションを実行して、並列コンピューティングにGPUを使用することを計画しています。これらのいくつかには、非常に大きな配列が含まれます。

カーネル内の合計メモリ(すべての変数とすべての配列)が6 GBのGPU RAMに達した場合、CPUのメモリをどうにかして使用できますか?

計算中はラップトップを何も使用しないので、メインのRAMはビジー状態にすべきではありません。

追伸Dell Precision 7530、windows 10を使用しています。

22
SuperCiocia

短い答え:いいえ、できません。

長い答え:GPUとRAM PCIeバス上のレイテンシは、GPUとVRAM間のレイテンシよりも桁違いです。そのため、また、CPUで数値を計算している場合もあります。

CPUはVRAMのpartを直接RAMとして使用できますが、通常よりも遅くなりますRAM PCIeはボトルネックであるため。スワップのようなものにそれを使用することは可能かもしれません。

以前は、GPU BIOSのストラップビットを変更することでメモリアパーチャサイズを増やすことが可能でしたが、Nvidia Fermi(GeForce 4xx)GPU以降、これを試していません。それでも動作する場合は、BIOSが標準よりも大きいアパーチャをマッピングするタスクに対応していることも必要です(ラップトップでテストされたことはほとんどありません)。

たとえば、 Xeon Phi計​​算カード は、それ全体をRAM= PCIアパーチャにマップする必要があるため、ホストに64ビット対応のBIOSが必要です。従来の4GB(32ビット)境界を超えるアパーチャをマッピングします。

41
Gordan Bobic

はい。これは、CPUとGPUの間の「共有」メモリであり、GPUでデータを転送するためのバッファーとして常に少量が必要になりますが、グラフィックカードへのより遅い「バッキング」としても使用できます。ページファイルと同じ方法で、メインメモリへのバッキングストアが遅くなります。

組み込みのWindowsタスクマネージャーで使用中の共有メモリを見つけるには、[パフォーマンス]タブに移動してGPUをクリックします。

enter image description here

ただし、共有メモリはGPUメモリよりも低速ですが、おそらくディスクよりは高速です。共有メモリは、かなり新しいマシンでは最大30GB/sで動作するCPUメモリですが、GPUメモリはおそらく256GB/s以上を実行できます。また、GPUとCPU、PCIeブリッ​​ジ間のリンクによって制限されます。これが制限要因になる可能性があり、Gen3またはGen4 PCIeを使用しているかどうか、およびCPUとGPUメモリ間の理論上の合計帯域幅を見つけるためにそれが使用しているレーン数(通常は「x16」)を知る必要があります。

10
Mokubai

私の知る限り、ホストのRAMである限り ページロック(固定)メモリ を共有できます。その場合、データ転送は多くなります。データを明示的に転送する必要がないため、より高速です。作業を同期することを確認するだけです(たとえば、CUDAを使用する場合はcudaDeviceSynchronizeと)。

さて、この質問について:

カーネルの合計メモリ(すべての変数とすべての配列)が6 GBのGPU RAMに達した場合、CPUのメモリをどうにかして使用できますか?

GPUメモリを「拡張」する方法があるかどうかはわかりません。 GPUがそれよりも大きい固定メモリを使用できるとは思いませんが、確信はありません。この場合にできることは、バッチで作業することです。一度に6GBで作業し、結果を保存して、別の6GBで作業するように作業を分散できますか?その場合、バッチで作業することが解決策になるかもしれません。

たとえば、次のような単純なバッチ処理スキームを実装できます。

int main() {

    float *hst_ptr = nullptr;
    float *dev_ptr = nullptr;
    size_t ns = 128;  // 128 elements in this example
    size_t data_size = ns * sizeof(*hst_ptr);

    cudaHostAlloc((void**)&hst_ptr, data_size, cudaHostAllocMapped);
    cudaHostGetDevicePointer(&dev_ptr, hst_ptr, 0);

    // say that we want to work on 4 batches of 128 elements
    for (size_t cnt = 0; cnt < 4; ++cnt) {
        populate_data(hst_ptr);  // read from another array in ram
        kernel<<<1, ns>>>(dev_ptr);
        cudaDeviceSynchronize();
        save_data(hst_ptr);  // write to another array in ram
    }

    cudaFreeHost(hst_ptr);

}
10
Armando Herrera

すべてのGPUがシステムを使用できますRAM独自のVRAMが不足している場合

システムでRAMが不足し、余分なデータをすべてストレージユニット(SSD/HDD)にページングするのと同様に、最新のGPUはシステムRAMからテクスチャやその他のデータをプルできます。システムからデータを使用するRAM PCIeバスを介して、より高速なVRAMの不足を補うことができます。

システムRAMはVRAMより数倍遅く、レイテンシがはるかに長いため、VRAMが不足するとパフォーマンスが低下し、PCIe帯域幅によってパフォーマンスが制限されます。

したがって、それが可能かどうかは問題ではなく、それを行うときのパフォーマンスの問題です。

また、統合された多くのGPUはシステムRAMを使用し、独自のGPUも持たないことにも注意してください。

GPUの場合、パフォーマンスの主な要因はソフトウェアです。適切に設計されたソフトウェアは、出力FLOPS=の制限近くでGPUを使用しますが、設計が不適切なものは使用しません。通常、コンピューティングおよびハッシュソフトウェアは1番目のカテゴリに分類されます。VRAMの割り当てについても同様です。

2
Overmind