2011-03-03 12 views
0

私は現在、大規模な科学計算プロジェクトの開発に携わり、MPI /クラスタアプローチの代替として、GPUによるハードウェアアクセラレーションの可能性を模索しています。私たちは主にメモリに拘束されており、あまりにも多くのデータをメモリに入れてGPUに収めています。この目的のために、私は2つの質問を持っています:システムRAMへのGPUアクセス

1)私が読んだ本では、デバイスのポインタを使ってホスト上のメモリにアクセスするのは不正です(明らかな理由により)。その代わりに、ホストのメモリからデバイスメモリにメモリをコピーしてから、計算してからコピーバックする必要があります。私の質問は、このための回避策があるかどうかです - システムRAMの値をGPUから読み取る方法はありますか?

2)より一般的には、これらのようなメモリ境界計算中にCPUとGPU間のデータ転送を最適化するためのアルゴリズム/ソリューションはありますか?

ありがとうございました!並列化がはるかに直感的であるため、私はCUDAに切り替えることに熱心です!

+0

チェックアウトhttp://stackoverflow.com/questions/5007556/cuda-zero-copy-memory-considerations/5011564#5011564 –

答えて

3

1)はい、ほとんどのGPGPUパッケージでこれを行うことができます。

AMD Stream SDKを使用すると、「システム」メモリにバッファを割り当てて、カーネルが読み書きするテクスチャとして使用できます。 CudaとOpenCLは同じ能力を持っていますが、キーはバッファ割り当てに正しいフラグを設定することです。

しかし...

  • データは、オーバーヘッドをたくさん持っているPCIeバス、全体に読み出し/書き込みされているので、あなたはそれをしたくない場合があります。

  • あなたのリクエストは自由に解釈できます。私はあなたがシステムメモリにバッファを見つけるためにそれを伝えることができます意味が、ソフトウェア・スタックは、その場でGPUのメモリにそれを再配置するようなことを行うために自由である - 限り、計算結果は同じ

あるとして2)主要なGPGPUソフトウェア環境(Cuda、OpenCL、Stream SDK)は、おそらくあなたが望むものであるDMA転送をサポートします。

0

でも可能ですが、GPUとそのメモリの間の帯域幅は通常非常に高いのに対し、PCI経由の転送はボトルネックになりがちなので、これは望ましくありません。

大きなデータセットで要素ごとに実行する演算が比較的少ない場合は、GPGPUがおそらくうまく機能しない可能性があります。

+0

これは、PCIe 3.0とハイエンドのマザーボードで可能です。なぜ4GB以上のメモリが必要な計算がサポートされていないのか分かりません。 – omellette

0

私は、プログラミングガイドをお勧めします。 多くの回答があります。 ストリーム、統合アドレッシング、cudaHostRegisterを確認します。

関連する問題