OpenCL:AMD Fusion和CL_MEM_USE_HOST_PTR

时间:2013-02-25 13:44:18

标签: opencl

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

当我调用我的内核时,“result”数组不会改变。我知道普通的GPU会将数据复制到设备内存并继续工作。普通的GPU会在之后复制数据吗?

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

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

谢谢,

托马斯

3 个答案:

答案 0 :(得分:3)

好的,我搜索了很长一段时间才得到答案。这是可能的,但仅限于某些情况。

您需要启用了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. 使用clEnqueueMapBuffer从Host访问缓冲区,并在使用clEnqueueUnmapMemObject读取/写入后释放它。
  3. 当启用VM时,没有任何内容被复制,您可以直接访问/没有VM它也可以正常工作,但它会复制数据。
  4. 查看AMD APP OpenCL编程指南第4.5.2节 - 放置

答案 1 :(得分:0)

我不确定我理解你。在OpenCL中(对于任何目标平台类型,CPU或GPU),对clCreateBuffer的调用将在设备上分配一些内存,并将数据从主机指针复制到新分配的内存(尽管只有在使用此调用内核时才能执行此副本)指针作为参数)。我不认为主机和设备可以在没有“同步”(也就是clEnqueueReadBuffer)的情况下在同一个内存上工作。

答案 2 :(得分:0)

在某些平台/设备上,调用 clFinish 足以从设备内存同步主机内存。在一般情况下,需要调用 clEnqueueReadBuffer clEnqueueMapBuffer clEnqueueMapBuffer 返回的指针应与您在创建缓冲区时提供的主机ptr相关。