2

我在 OpenCL 中遇到了一些关于 clCreateBuffer 的问题。我正在使用 AMD Fusion 处理器 (A10-5800k),因此两个设备(CPU 和 GPU)应该能够在彼此的内存上工作。

对于读取和结果缓冲区,我这样做:

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);

当我调用我的内核时,“结果”数组不会改变。我知道普通的 GPU 会将数据复制到设备内存并进行处理。普通的 GPU 会在之后将数据复制回来吗?

但是,我确实希望 Fusion GPU 不会复制数据,因为它可以在同一个指针上工作。不幸的是,我没有看到“结果”数组有任何变化。当我用 clEnqueueReadBuffer 阅读“bufWrite”时,我看到了变化。(我在阅读“结果”之前做了clFinish,所以应该写入数据)

有谁知道如何真正使用 CPU 和 GPU 在同一个阵列上工作?我真的很想避免使用 clEnqueueReadBuffer。

谢谢,

托马斯

4

3 回答 3

3

好的,我搜索了很长一段时间的答案。这是可能的,但仅在某些情况下。

您需要一个启用了 VM(虚拟内存)的 GPU。您可以使用 clinfo 进行检查。在驱动程序版本中查找“VM”,例如,

             Driver version: CAL 1.4.1695 (VM) 

我在 Linux 下有一个全新的 APU,不支持 VM。我认为 Linux 下并非所有 GPU 都支持它。接下来我将尝试 Windows。这是合理的,因为它需要与操作系统进行交互。我希望将来能支持 Linux。

无论如何,要使用它,您需要:

  1. 使用 CL_MEM_USE_HOST_PTR 或 CL_MEM_ALLOC_HOST_PTR 创建缓冲区。
  2. 使用 clEnqueueMapBuffer 从 Host 访问缓冲区,并在使用 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的调用足以将主机内存与设备内存同步。在一般情况下,需要调用clEnqueueReadBufferclEnqueueMapBuffer 。clEnqueueMapBuffer返回的指针应该与您在创建缓冲区时提供的主机 ptr 相关。

于 2013-02-25T17:35:00.957 回答