2012-07-02 15 views
7

私は初心者の並列プログラミングです。私は愚かであるように思われるかもしれない質問を持っていますが、私がそれを見つけたときに決定的な答えを得られませんでした。GPUはCPUまたはCPUからGPUへの書き込みを読み取りますか?

GPUコンピューティングでは、デバイス、つまりGPUとホスト、つまりCPUがあります。私はgpuでいくつかのメモリを割り当て、カーネルに2つのパラメータ(src []とdest [])を渡し、src文字列、つまりHello worldをdest文字列にコピーし、gpuからdest文字列を取得する単純なhello worldプログラムを書いたザ・ホスト。

文字列 "src"はGPUによって読み取られるのか、CPUはGPUに書き込みますか?また、GPUから文字列を取り戻す場合、GPUからCPUまたはCPUへの書き込みはGPUからですか? GPU に4つの可能性 1. CPUが存在することができる前後のデータを転送する際に

- CPUがGPU に書き込む - GPUはCPU にフォームCPU 2 GPUを読み出し - GPUはCPU に書き込む - CPUをGPUから読み取ります

誰かがこれらのうちどれが可能であり、どちらではないか説明できますか?

答えて

7

以前のバージョンのCUDAおよび対応するハードウェアモデルでは、GPUはより厳密にCPUが所有するコプロセッサでした。 CPUはGPUに情報を書き込んで、GPUの準備ができたら情報を読み戻しました。下位レベルでは、実際には4つの事柄すべてが起こっていました。つまり、CPUがPCIeにデータを書き込んだり、GPUがPCIeからデータを読み込んだり、GPUがPCIeにデータを書き込んだり、CPUがその結果を読み返したりします。しかしトランザクションはCPUによって開始されました。

最近では(CUDA 3→4でもおそらく2から始まる)、これらの詳細のいくつかはアプリケーションレベルから隠されているため、GPUコードによって転送がほぼ同じ方法で開始される可能性があります。 CPUが行うことができます。プログラマは、統一された仮想アドレス空間を使用して、CPUとGPUメモリ用の統一された仮想アドレス空間にアクセスできます。 GPUがCPU空間でメモリを要求する場合、これはCPUからの転送を開始しなければならず、基本的にCPUからの読み出しが必要です。 CPU側からGPUにデータを書き込む機能も保持されます。基本的には、すべての方法がトップレベルで可能です(低レベルでは、これは主に、PCIeバスの読み取りと書き込みの両方と同じプロトコルですが、GPUもトランザクションを開始できます)。

+1

さまざまな同期化されたコントローラを経由して、DMA(http://en.wikipedia.org/wiki/Direct_memory_access)が表示されます。 – Ani

+0

ありがとうございました。 GPUがトランザクションも開始できることを知っておいてください。 Openclのどのライブラリルーチンを使ってトランザクションを実際に開始したのかを知る方法はありますか?またはルーチンを使用して、CPUまたはGPUのどちらかに強制的にトランザクションを実行させることができます。 – Nike

+0

私はOpenCLをよく知りません。 CUDAが、変数が統一された仮想アドレス空間にどこに住んでいたかを確認するための方法をいくつか与えていないと、私は驚くでしょう。このような情報は、明示的に管理された転送のユースケースの外側であっても有用である可能性があります。 – Patrick87

1

OpenCLでは、ホスト(CPU)がGPUとGPU間のすべてのデータ転送を排他的に制御しています。ホストはバッファを使用してGPUにデータを転送します。ホストは、バッファを使用してGPUから を転送(読み込み)します。一部のシステムやデバイスでは、ホストとGPUが同じ物理メモリを使用するため、転送で物理的にバイトがコピーされません。これはゼロコピーと呼ばれます。

2

実際にはこれらのどれもありません。 CPUコードは、データのコピーをで開始しますが、のデータはメモリコントローラによって、システムに搭載されているすべてのバスを介してGPUのメモリに転送されます。一方、CPUは他のデータを処理することができる。 同様に、GPUが起動したカーネルの実行を終了すると、CPUコードがデータのコピーを開始しますが、GPUとCPUの両方で他のデータを処理したり、他のコードを実行することができます。

コピーは非同期または非ブロックと呼ばれます。必要に応じてブロックコピーを実行して、CPUがコピーの完了を待つことができます。

非同期タスクを起動するときは、通常、後でチェックできる何らかのフラグである「イベント」を登録して、タスクが終了したかどうかを確認します。

1

私はこのフォーラムで見つけたhttp://devgurus.amd.com/thread/129897 CL_MEM_ALLOC_HOST_PTRを使用しています。 clCreateBufferのCL_MEM_COPY_HOST_PTRは、ホスト上にメモリを割り当て、デバイス上にコピーされないことを示します。

パフォーマンスに問題があるかもしれませんが、これが私が探しているものです。あなたのコメントをお願いします..

関連する問題