私は以下を参考にしたいと思います。ホストコード、カーネル関数、そしてデバイス関数がカーネルから呼び出されています。私は、デバイスの機能だけがホスト配列を使用したい。私のホスト配列を何らかの方法で直接デバイスの機能から「可視」にすることはできますか?それとも最初にカーネルにコピーする必要がありますか?デバイスアレイへのホストアレイを使用するCUDA
答えて
デバイス機能がホストメモリに直接アクセスする方法はないと思います。たとえ可能であっても、待ち時間と帯域幅は残酷で価値がない可能性があります。
デバイス側の機能をホスト側のCPUで実行したい場合は、それが可能です。関数定義に接頭辞__host__ __device__
を付けることができ、その関数はホストとデバイスの両方でコンパイルされ、CPU上で直接使用できるようになります。唯一の捉え方は、関数がCPU上で利用できないCUDA機能(例えば、共有メモリなど)を利用できないことです。
CUDA 2.2。カーネルによって直接アクセスできるように、CUDAアドレス空間にマップされた「マップされた固定メモリ」を導入しました。メモリはcudaHostAlloc()によって割り当てられなければならず、誰がホストメモリを割り当てるのかは不明です。 CUDA 4.0では、cudaHostRegister()を使用して既存の仮想アドレス範囲をページロックする機能が追加されました.cudaHostAlloc()はオプションでホストメモリをデバイスのアドレス空間にマップできます。 – ArchaeaSoftware
興味深い...情報をありがとう! –
CUDAカーネルは、GPU(デバイス)上で実行されるコードです。 GPUはメインCPUメモリではなく、グラフィックスカード上のメモリにのみアクセスできます。 CPUはメインメモリとデバイスメモリの間でデータをコピーできます。通常のシナリオは次のとおり
- CPU:メインメモリ
- CPUに入力データを作成:メインメモリにデバイスからコピー出力:カーネル
- CPUを実行しますデバイス
- GPUへの入力データをコピーします
official documentationを読むことをお勧めします。スライドをご希望の場合は、introductory presentationからお申し込みください。
をホストの大きさあなたはそれを読む必要があるのでしょうか、それともデバイスの機能もそれに書き込む必要がありますか? – talonmies