OpenCL 中的全局内存限制

Posted

技术标签:

【中文标题】OpenCL 中的全局内存限制【英文标题】:Global memory limit in OpenCL 【发布时间】:2014-03-25 16:14:48 【问题描述】:

首先,我只想说我是 OpenCL 的新手,我没有很强的计算机科学背景,因为我不是学的。

所以,我正在编写一个工具来计算给定数字地形模型 (DTM) 的地平线。为此,我在其任务并行方法中使用 OpenCL,因为数据并行化要么不可能,要么我找不到方法。

我有 8 个内核,每个内核计算 360 度地平线的一部分(或全景或任何你想称之为的)。这背后的数学非常简单。只需在某个方向上从像素跟踪一条线并查找高度。然后,对 360 个方向上的所有像素重复此操作。

关键是我成功了,但我发现了一件事。如果我使用较小的 DTM,看起来我会得到正确的结果,但如果我使用非常大的 DTM,那么它甚至不会进入内核。

最大的问题是:发生这种情况有什么原因吗?是否可以向 GPU 发送 3-4 GB 的数据?我只是忽略了一些基本的东西,比如没有办法拥有 4gb 的全球数据吗?我将数据作为指向内核的指针发送,所以不要出什么问题。

谢谢!!

更新:

错误确实是我没有检查所有步骤。我收到一个 CL_MEM_OBJECT_ALLOCATION_FAILURE 错误,所以我想我需要以某种方式缩小内存对象的大小。谢谢大家!

【问题讨论】:

从给定的描述中很难判断,但有一些可能的问题: single 内存分配的最大大小有限制 - 搜索 clDeviceGetInfo 和 @ 987654322@。此外,即使不超过此大小,内存碎片也可能会导致问题。第三:您是否严格检查程序早期可能出现的任何错误? (OpenCL 的错误检查可能很乏味,所以人们倾向于忽略它,不幸的是......) 您使用的是什么 GPU?你的错误到底发生在哪里?不知道这一点,只能推测。 @Marco13 我想我正在检查所有错误,但我明天会在办公室看看。我还将粘贴一些代码,以便您可以帮助我。谢谢! @TomFenech 这是一个 Nvidia GPU(现在不知道具体是什么型号)。关键是没有错误,所以代码运行正确但结果没有意义。我强迫内核给出结果“1”而它没有,这就是为什么我认为它不运行内核。 【参考方案1】:

首先,您确实需要检查 OpenCL API 调用的结果。如果“它甚至没有进入内核”,那么其中一个 API 调用返回了一些您错过的错误值。

其次,缓冲区大小(以及许多其他值)确实存在限制。 OpenCL 规定了每个值的最小限制,但除此之外它取决于设备,您需要使用 clGetDeviceInfo 询问您的特定设备的最大值。

【讨论】:

明天在办公室我会重新检查所有的错误,以防我错过了什么,我会检查 clGetDeviceInfo。谢谢! 错误确实是我没有检查所有步骤。我收到一个 CL_MEM_OBJECT_ALLOCATION_FAILURE 错误,所以我想我需要以某种方式缩小内存对象的大小。谢谢大家!

以上是关于OpenCL 中的全局内存限制的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法打破android中openCL内存的限制?

OpenCL 中的全局内存是不是连续

将全局内存用于(大)本地/私有温度。 OpenCL 中高效的数据结构

OpenCL - 全局内存读取性能优于本地

为啥 Cuda/OpenCL 的全局内存中没有银行冲突?

OpenCL中工作项和全局内存之间的内存传输?