gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:13:11 29 4
gpt4 key购买 nike

在调查我的程序崩溃的原因后,我发现我达到了缓冲区大小的最大值,对我来说是 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 值。

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

我只是不确定如何将一小组值传递到我的内核中,因为在获得输出之前,这些值需要经过三个步骤。

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

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

最佳答案

查看 OpenCL specificationclCreateBuffer 我会说这里的解决方案是允许通过将 CL_MEM_USE_HOST_PTR 添加到 flags(或其他任何内容)来使用主机内存适合您的用例)。 CL_MEM_USE_HOST_PTR 中的段落:

This flag is valid only if host_ptr is not NULL. If specified, itindicates that the application wants the OpenCL implementation to usememory referenced by host_ptr as the storage bits for the memoryobject.

The contents of the memory pointed to by host_ptr at the timeof the clCreateBuffer call define the initial contents of the bufferobject.

OpenCL implementations are allowed to cache the buffercontents pointed to by host_ptr in device memory. This cached copy canbe used when kernels are executed on a device.

这意味着驱动程序将以最有效的方式在主机和设备之间传递内存。基本上是您在评论中提出的建议,除了它已经内置到驱动程序中,使用一个标志激活,并且可能比您能想到的任何东西都更有效。

关于c - OpenCL - clCreateBuffer 大小错误。可能的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38769401/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com