3

私はcudaを学んでいますが、これまでのところ、cudaにはcudaMalloc()グローバルオブジェクトにメモリを割り当てる機能があることを知りました。しかし、現在、いくつかの行列乗算コードでcudaMemcpy()、オブジェクトをホストからデバイスに、またはその逆にコピーするという別の関数が使用されていることがわかりました。しかし、なぜそれが必要なのかわかりませんか?はグローバル メモリを割り当てているためcudaMalloc()、すべてのデバイス コアがアクセスできるはずですよね。

私の誤解はどこにありますか?

4

5 に答える 5

8

この資料のスライド 10、11、12 をご覧ください。基本的な処理の流れを示しています。通常、カーネル呼び出しの前に表示される cudaMemcpy は、スライド 10 のアクティビティに対応します。カーネル呼び出し自体は、スライド 11 で表されます。スライド 12 は、カーネル呼び出しの後に発生する cudaMemcpy を表します。GPUcudaMallocは CPU に似てmallocいます。スペースを割り当てるだけで、データを入力しません。を使用して GPU にスペースを割り当てたら、 を使用して GPUcudaMallocにデータをコピーする必要がありますcudaMemcpyこの場合、「グローバル メモリ」はデバイス上のメモリを指します。つまり、スライド 10、11、および 12 の右側にあります。デバイス カーネルは、デバイス上にあるデータ、つまり、スライド 10、11、および 12 の右側にある DRAM に移動されたデータのみを処理できます。そして12。

于 2012-12-13T06:56:45.637 に答える
5

cudaMalloc() は、未定義の初期値を持つ GPU メモリ上のメモリのチャンクのみを提供します。ホストまたはデバイスのどこかから目的のメモリコンテンツをコピーする必要があります。

于 2012-12-13T06:47:52.340 に答える
1

malloc() は、ホスト、つまり CPU に動的メモリを割り当てます。デバイスにグローバル メモリを割り当てるには、cudaMalloc() を呼び出す必要があります。GPU を使用してデータを操作するには、ホール データをグローバル メモリに転送する必要があります。cudaMalloc() はメモリを割り当てるだけで、デバイス メモリにデータをコピーしません。したがって、データをホスト メモリからデバイス メモリにコピーするには、cudaMemcpy() を呼び出す必要があります。

于 2013-05-30T15:10:32.407 に答える
0

すべてのメモリ割り当てとコピーは、ホストからのみ実行できます。

すべてのGPUアクティビティについて、メモリはデバイス(GPU)に割り当てられ、ホスト(CPU)から開始する必要があります。

その後、ホストからのメモリが計算/処理のためにデバイス(Memcpy)に転送されます。

その後、カーネルが計算のために呼び出されます。

次に、デバイスで計算された結果がMemcpyを介してホストに転送されます。

于 2012-12-17T12:21:06.497 に答える
0

CPU で実行されるコードは、その (ホスト) メモリに割り当てられたバッファにのみアクセスできますが、GPU コード (CUDA カーネル) は、デバイス (GPU) メモリ内のメモリにのみアクセスできます。行列乗算の例で入力行列を初期化するコードは CPU 上で実行されるため、ホスト メモリ内でのみ実行できます。次に、デバイス メモリに割り当てた空間にこれらのマトリックスをコピーするために cudaMemcpy を呼び出す必要があります。これは、そこに直接書き込むことができないためです。次に、CUDA カーネルが起動され、デバイス メモリ内の行列に対して処理が実行され、結果がデバイス メモリ内の別のバッファに格納されます。cudaMemcpy は、カーネルが結果をデバイス メモリからホスト メモリにコピーするのを完了すると、再度使用されます。これにより、結果をホスト コードで再度使用できるようになります (たとえば、結果を表示または保存するため)。

于 2012-12-13T16:55:16.540 に答える