1

ホスト (CPU) とデバイス (GPU) の両方からアクセスできるメモリ ブロックを割り当てる方法を見つけようとしています。cudaHostAlloc() 関数を使用して、CPU と GPU の両方にアクセスできるページロック メモリを割り当てる以外に、そのようなメモリ ブロックを割り当てる方法はありますか? コメントありがとうございます。

4

3 に答える 3

2

ホストとデバイスがメモリを「共有」する唯一の方法は、新しいゼロコピー機能を使用することです。これは、GT200 アーキテクチャ カードと一部の新しいラップトップ カードで利用できます。お気づきのように、このメモリは、ページがロックされるように cudaHostAlloc で割り当てる必要があります。代替手段はなく、この機能でさえ古い CUDA 対応カードでは利用できません。

ホストからデバイスへの転送を管理するための簡単な (おそらくパフォーマンスの低い) 方法を探しているだけなら、Thrust ライブラリをチェックしてください。デバイスにメモリを割り当てることができるベクトル クラスがありますが、ホスト上にあるかのようにホスト コードから読み書きできます。

もう 1 つの方法は、転送を管理する独自のラッパーを作成することです。

于 2009-11-16T10:27:17.130 に答える
1

を使用しない限り、GPU と CPU の両方がアクセスできるバッファーを割り当てる方法はありませんcudaHostAlloc()。これは、固定されたメモリを CPU に割り当てる必要があるだけでなく (CUDA の外部で行うこともできます)、メモリを GPU (より具体的にはコンテキストの) 仮想メモリにマップする必要があるためです。

ディスクリート GPU では、ゼロコピーによってバス転送が発生するのは事実です。ただし、アクセスが適切に結合されていて、データを 1 回だけ消費する場合は、データをデバイスに転送してから 2 段階でマルチプロセッサに読み込むという代替手段があるため、依然として効率的です。

于 2009-11-21T16:28:50.637 に答える
0

いいえ、GPU メモリにバッファをアップロードする「自動方法」はありません。

于 2009-11-16T12:28:34.813 に答える