私はNvidia Quadro P3200という専用GPUを搭載したノートパソコンを持っています。6GBのRAMを搭載しています
ノートパソコンも「普通に」32GBのRAM(CPU?
並列計算にGPUを使って物理シミュレーションを実行することを計画しています。これらの中には、かなり大きな配列を含むものもあります
私はただ疑問に思っているのですが、私のカーネルの合計メモリ(すべての変数とすべての配列)がGPU RAMの6GBに達した場合、どうにかしてCPUのものを使用することができますか?
私は計算中はノートパソコンを他のことには使わないので、メインのRAMは忙しくないはずです
P.S. 私はDell Precision 7530、windows 10を使用しています
26 SuperCiocia 2020-04-26
簡単な答えだいいえ、できません
より長い答えです。PCIeバスを介したGPUとRAMの間の帯域幅、さらに重要なレイテンシは、GPUとVRAMの間よりも桁違いに悪いので、そんなことをしようとしているのであれば、CPUで数値計算をしているのと同じようなものかもしれません
CPUはVRAMの一部(PCIの開口部にマップされた部分、通常は256MB)をそのままRAMとして使うことができますが、PCIeがボトルネックになっているため、通常のRAMよりも遅くなってしまいます。スワップのようなものに使えば実現可能かもしれません
以前はGPU BIOSのストラップビットを変更することでメモリの開口部サイズを大きくすることが可能でしたが、Nvidia Fermi(GeForce 4xx)GPU以降は試していません。それでも動作する場合は、標準よりも大きな開口部をマッピングするためにBIOSがアップしていることも必要です(ノートPCでテストしたことがない可能性が高いです)
例えば、Xeon Phi コンピュートカードは、RAM全体をPCIアパーチャにマップする必要があるため、従来の4GB(32ビット)境界を超えるアパーチャをマップする方法を知っている64ビット対応のBIOSがホストに必要です
42 Gordan Bobic 2020-04-26
これはCPUとGPUの間の「共有」メモリであり、GPUにデータを転送するためのバッファとして必要な少量が常にあるが、ページファイルがメインメモリへのより遅いバッキングストアであるのと同じ方法で、グラフィックカードへのより遅い「バッキング」として使用することもできる
ビルトインWindowsタスクマネージャで使用中の共有メモリは、パフォーマンスタブでGPUをクリックすることで見つけることができます
共有メモリはGPUメモリよりも遅くなりますが、おそらくディスクよりも速くなります。共有メモリはCPUメモリであり、それなりに新しいマシンでは30GB/sまで動作するかもしれませんが、GPUメモリは256GB/s以上の動作が可能でしょう。また、GPUとCPU間のリンク、PCIeブリッジによっても制限されます。これが制限要因かもしれません。そして、CPUとGPUメモリ間の理論的な帯域幅の合計を見つけるために、Gen3またはGen4 PCIeを持っているかどうかと、それが使用しているレーンの数(通常は “x16″)を知る必要があります
10 Mokubai 2020-04-26
私の知る限りでは、ページロック(固定)メモリであれば、ホストのRAMを共有することができます。その場合、明示的にデータを転送する必要がないので、データ転送ははるかに速くなります
さて、この質問のために
私はただ疑問に思っているのですが、私のカーネルの合計メモリ(すべての変数とすべての配列)がGPU RAMの6GBに達した場合、どうにかして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 2020-04-26
どのGPUでも、VRAMが足りなくなったらシステムRAMを使うことができます
システムのRAMを使い果たし、余ったデータをすべてストレージユニット(SSD/HDD)にページングするのと同様の方法で、最新のGPUは、システムRAMからテクスチャやその他のデータを引き出すことができ、また、引き出すことができます。テクスチャデータは、PCIeバスを介してシステムRAMから使用して、より高速なVRAMの不足を補うことができます
システムRAMはVRAMよりも数倍遅く、レイテンシが高いため、VRAMが不足するとパフォーマンスが低下し、PCIeの帯域幅によってもパフォーマンスが制限されます
だから可能性があるかどうかではなくて、やるときの性能の問題なんです
また、多くの統合されたGPUは、システムRAMを使用していることに注意してください
GPUの場合、その性能の主な要因はソフトウェアです。よく設計されたソフトウェアは、GPUを出力FLOPSの限界付近で使用しますが、うまく設計されていないソフトウェアは使用しません。通常、コンピューティングとハッシュ化ソフトウェアは第1のカテゴリに入ります。VRAMの割り当ても同様です
3 Overmind 2020-04-28