OpenCL - clCreateBuffer大小错误。可能的解决方法?

时间:2016-08-04 13:55:39

标签: c memory opencl

在调查我的程序崩溃的原因后,我发现我的缓冲区大小达到最大值,对我来说是{512}({1}}。

就我而言,这是参数。

(CL_DEVICE_MAX_MEM_ALLOC_SIZE)

所以我的clCreateBuffer看起来像这样:

P = 146 (interpolation factor)
num_items = 918144 (number of samples)
sizeof(float) -> 4

当上面的乘法加上并除以(1024x1024)时,你会得到大约511Mb,低于阈值。现在将任何参数更改为更高的参数并且崩溃,因为它将超过512的值。

我的问题是,如何以一种方式实现代码,我可以使用块大小来进行计算,而不是将所有内容存储在内存中并将大量数据传递给内核?实际上,我拥有的样本数量很容易变为超过500万,而我绝对将没有足够的内存来存储所有这些值。

我只是不确定如何将小的值集传递到我的内核中,因为我在获取输出之前有三个步骤值。

首先是插值内核,然后将值转到低通滤波器内核,然后转到执行抽取的内核。之后,将值写入输出数组。如果为了解决问题需要程序的更多细节,我可以添加更多。

更新 不确定这里的预期答案是什么,如果有人有理由我很乐意听到并且可能接受它作为有效答案。我不再使用OpenCL了,所以我没有设置验证。

1 个答案:

答案 0 :(得分:0)

看看OpenCL specificationclCreateBuffer,我想说的解决方案是通过向CL_MEM_USE_HOST_PTR添加flags允许使用主机内存(或任何适合您用例的内容)。 CL_MEM_USE_HOST_PTR的段落:

  

仅当host_ptr不为NULL时,此标志才有效。如果指定,它   指示应用程序希望使用OpenCL实现   host_ptr引用的内存作为内存的存储位   宾语。

     

当时host_ptr指向的内存内容   clCreateBuffer调用的定义缓冲区的初始内容   宾语。

     

允许OpenCL实现缓存缓冲区   设备存储器中host_ptr指向的内容。此缓存的副本可以   在设备上执行内核时使用。

这意味着驱动程序将以其最有效的方式在主机和设备之间传递内存。基本上,您可以在注释中提出自己的建议,不同之处在于它已经内置在驱动程序中,可以通过单个标志激活,并且可能比您想出的任何方法都要有效。