首先,我只是想说我是OpenCL的新手,而且我不具备计算机科学的强大背景,因为这不是我学过的东西。
所以,我正在编写一个工具,在给定数字地形模型(DTM)的情况下计算地平线。为此,我在其任务并行方法中使用OpenCL,因为数据并行化是不可能的,或者我无法找到方法。
我有8个内核,每个内核计算一个360度视界的一部分(或全景或任何你想称之为的内容)。这背后的数学非常简单。只需沿某个方向跟踪像素的一条线,然后查找高度的高度。然后,对360个方向的所有像素重复此操作。
重点是我成功了,但我发现了一件事。如果我使用较小的DTM,看起来我得到了正确的结果,但如果我使用非常大的DTM,那么它甚至不会进入内核。
最大的问题是:为什么会出现这种情况?是否可以向GPU发送3-4 GB的数据?我只是忽略了一些基本的东西,比如没有办法获得4GB的全局数据?我将数据作为指向内核的指针发送,以免出现问题。
谢谢!
更新:
错误确实是我没有检查所有步骤。我收到了一个CL_MEM_OBJECT_ALLOCATION_FAILURE错误,所以我想我需要以某种方式缩小内存对象的大小。谢谢大家!
答案 0 :(得分:0)
首先,您确实需要检查OpenCL API调用的结果。如果“它甚至没有进入内核”,则其中一个API调用返回了一些您错过的错误值。
其次,缓冲区大小(以及许多其他值)确实存在限制。 OpenCL规定了每个值的最小限制,但除了它依赖于设备之外,您需要使用clGetDeviceInfo
向特定设备询问其最大值。
答案 1 :(得分:0)
我还建议查看此链接: http://devgurus.amd.com/thread/158397提供有关全局内存限制的更多信息。