0

我在一个数组中有 1000 个浮点数据。我想分成不同的班级,比如说4个班级。它们的大小是不可预测的。我可以轻松地将它们保存在 CPU 实现中的链表中,但在 OpenCL 内核中,有这样的机会吗?在我看来,这个问题有 3 个解决方案。首先,在类数中构造长度为 1000 的数组,这很耗费内存。其次,我分配了一个长度为 1000 的数组并将它们分成几部分。但是,我可能会将值从不同的索引传输并索引到不同的索引中,因为我不知道每个类的大小,它们可能超过我为每个类提供的大小。

第三,在我看来更好的是,我得到了两个长度相同的不同数组。其中一个存储数据,另一个存储指针。例如,在数据数组的第 i 个索引中,存储属于第 2 类的值。此外,在指向属于第二类的下一个数据的指针的第 i 个索引中。但这仅适用于原子类型(如 int、float、char 等)链表。

我是 OpenCL 的新手。我还不知道它的很多功能。如果有更好的方法,请不要与我和其他人分享。

4

1 回答 1

3

在 GPU 上使用指针通常是非常糟糕的主意。大部分数据驻留在全局内存中,为了快速获取它,应该合并访问。使用指针完全破坏了访问模式,使其本质上是随机的。它在 CPU 上也不是很好,因为它会导致很多缓存未命中,但是 CPU 具有更大的缓存和“更智能”的内部逻辑,因此它通常不是那么重要,但有时缓存感知内存访问模式可以将 CPU 应用程序的速度提高近数量级。在 GPU 上,合并全局内存访问是最重要的优化之一,而指针无法提供它。

如果您的内存不是非常短,我建议使用第一种方法并预分配足够大的数组以容纳所有数据。如果您真的内存不足,您可以使用纹理来存储您的数据和指针数组,但这取决于算法是否会提供任何好处。

于 2012-05-03T17:28:56.590 回答