在调查我的程序崩溃的原因后,我发现我的缓冲区大小达到最大值,对我来说是{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了,所以我没有设置验证。
答案 0 :(得分:0)
看看OpenCL specification和clCreateBuffer
,我想说的解决方案是通过向CL_MEM_USE_HOST_PTR
添加flags
来允许使用主机内存(或任何适合您用例的内容)。 CL_MEM_USE_HOST_PTR
的段落:
仅当host_ptr不为NULL时,此标志才有效。如果指定,它 指示应用程序希望使用OpenCL实现 host_ptr引用的内存作为内存的存储位 宾语。
当时host_ptr指向的内存内容 clCreateBuffer调用的定义缓冲区的初始内容 宾语。
允许OpenCL实现缓存缓冲区 设备存储器中host_ptr指向的内容。此缓存的副本可以 在设备上执行内核时使用。
这意味着驱动程序将以其最有效的方式在主机和设备之间传递内存。基本上,您可以在注释中提出自己的建议,不同之处在于它已经内置在驱动程序中,可以通过单个标志激活,并且可能比您想出的任何方法都要有效。