7

私は並列プログラミングの初心者です。ばかげているように見えるかもしれないクエリがありますが、グーグルで検索したときに明確な答えが得られませんでした。

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

文字列「src」はGPUによって読み取られますか、それともCPUはGPUに書き込みますか?また、GPUから文字列を取得する場合、GPUはCPUに書き込みますか、それともCPUはGPUから読み取りますか?

データを前後に転送するには、4つの可能性があります。1。CPUからGPU-GPUへのCPU書き込み-CPUからのGPU読み取り2.GPUからCPU-CPUへのGPU書き込み-GPUからのCPU読み取り

誰かがこれらのどれが可能でどれが不可能かを説明できますか?

4

4 に答える 4

7

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

最近では (CUDA 3? 4? 2 で始まることもある?)、これらの詳細の一部がアプリケーション レベルから隠されているため、事実上、GPU コードは CPU とほぼ同じ方法で転送を開始できます。プログラマーが CPU および GPU メモリの統合仮想アドレス空間にアクセスできる統合仮想アドレス指定を検討してください。GPU が CPU 空間でメモリを要求すると、これは CPU から転送を開始する必要があり、基本的には CPU から読み取ります。CPU 側から GPU にデータを配置する機能も保持されます。基本的に、すべての方法が最上位で可能になりました (低レベルでは、PCIe バスからの読み取りと書き込みの両方が、通常と同じ種類のプロトコルですが、GPU もトランザクションを開始できるようになりました)。

于 2012-07-02T20:06:11.350 に答える
2

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

コピーは、非同期またはノンブロッキングと呼ばれます。必要に応じて、CPU がコピーの完了を待機するブロッキング コピーを実行できます。

非同期タスクを起動するときは、通常、「イベント」を登録します。これは、タスクが終了したかどうかを確認するために、後で確認できるフラグのようなものです。

于 2012-07-04T22:30:16.827 に答える
1

このフォーラムhttp://devgurus.amd.com/thread/129897 で CL_MEM_ALLOC_HOST_PTR | clCreateBuffer の CL_MEM_COPY_HOST_PTR はホストにメモリを割り当て、デバイスにはコピーされません。

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

于 2012-07-06T18:14:56.840 に答える
1

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

于 2012-07-03T21:25:30.200 に答える