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 中的全局内存限制的主要内容,如果未能解决你的问题,请参考以下文章