Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL:AMD Fusion和CL_MEM_USE_HOST_PTR_Opencl - Fatal编程技术网

OpenCL:AMD Fusion和CL_MEM_USE_HOST_PTR

OpenCL:AMD Fusion和CL_MEM_USE_HOST_PTR,opencl,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_M

我在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不会复制数据,因为它可以在同一个指针上工作。不幸的是,我在“result”数组中没有看到任何更改。当我用clEnqueueReadBuffer阅读“bufWrite”时,我看到了变化。(我没有在读取“结果”之前完成,因此应该写入数据)

有没有人知道如何真正使用CPU和GPU在同一阵列上工作?我真的想避开克伦奎雷亚德

谢谢


托马斯

我不太明白你的意思。在OpenCL中(对于任何目标平台类型,CPU或GPU),对clCreateBuffer的调用将在设备上分配一些内存,并将数据从主机指针复制到新分配的内存中(尽管只有当以该指针作为参数调用内核时,才能进行此复制)。我认为主机和设备不可能在没有“同步”(也称为ClenqueureAdBuffer)的情况下在同一内存上工作。

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

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

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

             Driver version: CAL 1.4.1695 (VM) 
我在Linux下有一个相当新的APU,不支持VM。我认为Linux下的所有GPU都不支持它。下一步我将尝试Windows。这是合理的,因为它需要在这个平台上与操作系统交互。我希望Linux支持将来会出现

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

  • 使用CL_MEM_USE_HOST_PTR或CL_MEM_ALLOC_HOST_PTR创建缓冲区
  • 使用ClenqueumAppBuffer从主机访问缓冲区,并在使用ClenqueumAppMemObject读/写后释放缓冲区
  • 启用VM时,不会复制任何内容,您可以直接访问/如果没有VM,它也可以工作,但会复制数据
    查看AMD应用程序OpenCL编程指南第4.5.2节-放置

    例如,当您将CPU与OpenCL(设备==主机==CPU)一起使用,并使用CL_MEM_use_host_PTR创建缓冲区时,不会复制内存,而是处理实际数据。对于AMD Fusion,GPU也应该可以这样做(至少我认为这是可能的)。我现在没有时间回答你的问题,但这里是我不久前写的关于APU的一个答案,这可能会有所帮助: