OpenCL - clCreateBuffer大小错误。可能的工作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCL - clCreateBuffer大小错误。可能的工作?相关的知识,希望对你有一定的参考价值。
在调查我的程序崩溃的原因之后,我发现我的缓冲区大小达到了最大值,这对我来说是512Mb (CL_DEVICE_MAX_MEM_ALLOC_SIZE)
。
在我的例子中,这是参数。
P = 146 (interpolation factor)
num_items = 918144 (number of samples)
sizeof(float) -> 4
所以我的clCreateBuffer看起来像这样:
output = clCreateBuffer(
context,
CL_MEM_READ_ONLY,
num_items * P * sizeof(float),
NULL,
&status);
当上面的乘法加上并除以(1024x1024)时,你会得到大约511Mb,低于阈值。现在将任何参数更改为一个更高的参数,它会崩溃,因为它将超过512的值。
我的问题是,如何以一种方式实现代码,我可以使用块大小来进行计算,而不是将所有内容存储在内存中并将大量数据传递给内核?实际上,我的样本数量很容易变化到超过500万,我肯定没有足够的内存来存储所有这些值。
我只是不确定如何将小的值集传递到我的内核中,因为在获得输出之前,我有三个步骤值。
首先是插值内核,然后将值转到低通滤波器内核,然后转到执行抽取的内核。之后,将值写入输出数组。如果为了解决问题需要程序的更多细节,我可以添加更多。
更新不确定这里的预期答案是什么,如果有人有理由我希望听到它并可能接受它作为有效答案。我不再使用OpenCL了,所以我没有设置验证。
看看OpenCL specification和clCreateBuffer
我会说这里的解决方案是允许通过将CL_MEM_USE_HOST_PTR
添加到flags
(或任何适合您的用例)来使用主机内存。来自CL_MEM_USE_HOST_PTR
的段落:
仅当host_ptr不为NULL时,此标志才有效。如果指定,则表示应用程序希望OpenCL实现使用host_ptr引用的内存作为内存对象的存储位。
在clCreateBuffer调用时host_ptr指向的内存的内容定义缓冲区对象的初始内容。
允许OpenCL实现将host_ptr指向的缓冲区内容缓存在设备内存中。在设备上执行内核时,可以使用此缓存副本。
这意味着驱动程序将以最有效的方式在主机和设备之间传递内存。基本上你在评论中提出自己的意思,除了它已经内置在驱动程序中,用一个标志激活,并且可能比你能想出的任何东西都更有效率。
以上是关于OpenCL - clCreateBuffer大小错误。可能的工作?的主要内容,如果未能解决你的问题,请参考以下文章
任务的恒定大小 - 在 1x 和 2x CPU 上的执行时间相同 - OpenCl
Windows 上的 OpenCL/OpenGL 纹理互操作:调整 OpenGL 纹理的大小