我在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。
谢谢,
托马斯
答案 0 :(得分:3)
好的,我搜索了很长一段时间才得到答案。这是可能的,但仅限于某些情况。
您需要启用了VM(虚拟内存)的GPU。您可以使用clinfo进行检查。在驱动程序版本中查找“VM”,例如
Driver version: CAL 1.4.1695 (VM)
我在Linux下有一个非常新的APU,不支持VM。我认为Linux下的所有GPU都不支持它。我接下来会试试Windows。这似乎是合理的,因为它需要与OS进行交互。我希望将来会有Linux支持。
无论如何,要使用它,你需要:
查看AMD APP OpenCL编程指南第4.5.2节 - 放置
答案 1 :(得分:0)
我不确定我理解你。在OpenCL中(对于任何目标平台类型,CPU或GPU),对clCreateBuffer的调用将在设备上分配一些内存,并将数据从主机指针复制到新分配的内存(尽管只有在使用此调用内核时才能执行此副本)指针作为参数)。我不认为主机和设备可以在没有“同步”(也就是clEnqueueReadBuffer)的情况下在同一个内存上工作。
答案 2 :(得分:0)
在某些平台/设备上,调用 clFinish 足以从设备内存同步主机内存。在一般情况下,需要调用 clEnqueueReadBuffer 或 clEnqueueMapBuffer 。 clEnqueueMapBuffer 返回的指针应与您在创建缓冲区时提供的主机ptr相关。