2

I got some problems with clCreateBuffer in OpenCL. I am working with an AMD Fusion processor (A10-5800k), so both devices (CPU and GPU) should be able to work on each others memory.

For the read and result buffer I do:

bufRead = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, size, data, &err);
bufWrite = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, result, &err);

When I call my kernel, the "result" array doesn't change. I know that normal GPUs would copy the data to the device memory and work on that. Would normal GPUs copy the data back afterwards?

However, I did hope that the Fusion GPU does not copy the data, because it can work on the same pointer. Unfortunately, I don't see any change in the "result" array. When I read "bufWrite" with clEnqueueReadBuffer I see the changes. (I do clFinish before reading "result", so the data should be written)

Does anyone know how to truly work on the same array with CPU and GPU? I really want to avoid clEnqueueReadBuffer.

Thanks,

Tomas

4

3 に答える 3

3

OK、私は答えをかなり探しました。可能ですが、特定の状況下でのみ可能です。

VM (仮想メモリ) が有効になっている GPU が必要です。これは clinfo で確認できます。ドライバーのバージョンで「VM」を探します。

             Driver version: CAL 1.4.1695 (VM) 

Linux でまったく新しい APU を使用していますが、VM はサポートされていません。Linux のすべての GPU でサポートされているわけではないと思います。次は Windows を試してみます。これはOSとやり取りする必要があるため、もっともらしいです。将来的に Linux がサポートされることを願っています。

とにかく、それを使用するには、次のことが必要です。

  1. CL_MEM_USE_HOST_PTR または CL_MEM_ALLOC_HOST_PTR を使用してバッファーを作成します。
  2. Host から clEnqueueMapBuffer でバッファにアクセスし、clEnqueueUnmapMemObject で読み取り/書き込み後に解放します。
  3. VM が有効になっている場合、何もコピーされず、直接アクセスできます。VM がなくても機能しますが、データはコピーされます。

AMD APP OpenCL プログラミング ガイドのセクション 4.5.2 - 配置を確認してください。

于 2013-02-28T11:42:13.847 に答える
0

私はあなたを理解しているかどうか確信が持てません。OpenCL (任意のターゲット プラットフォーム タイプ、CPU または GPU) では、clCreateBuffer を呼び出すと、デバイスにメモリが割り当てられ、ホスト ポインターから新しく割り当てられたメモリにデータがコピーされます (ただし、このコピーは、カーネルがこれで呼び出された場合にのみ実行される可能性があります)。ポインターを引数として)。ホストとデバイスが「同期」(別名 clEnqueueReadBuffer) なしで同じメモリ上で動作する可能性はないと思います。

于 2013-02-25T14:24:44.377 に答える
0

一部のプラットフォーム/デバイスでは、デバイス メモリからホスト メモリを同期するには、 clFinishを呼び出すだけで十分です。通常、 clEnqueueReadBufferまたはclEnqueueMapBufferへの呼び出しが必要です。clEnqueueMapBufferによって返されるポインターは、バッファーの作成時に指定したホスト ptr に関連している必要があります。

于 2013-02-25T17:35:00.957 に答える