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 specificationclCreateBuffer我会说这里的解决方案是允许通过将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大小错误。可能的工作?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL 缓冲区大小填充

任务的恒定大小 - 在 1x 和 2x CPU 上的执行时间相同 - OpenCl

Windows 上的 OpenCL/OpenGL 纹理互操作:调整 OpenGL 纹理的大小

OpenCL 本地内存大小和计算单元数量

OpenCL 多 GPU 积分 - 将全局大小从 32 更改为 64 时的段错误

OpenCL 中的最佳本地/全局工作量