【问题标题】:Linked List in OpenCLOpenCL 中的链表
【发布时间】:2012-05-12 19:58:05
【问题描述】:

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

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

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

【问题讨论】:

  • 我知道现在回答这个问题可能为时已晚,但在 OpenCL 中使用链表似乎仍然很有趣,所以我在这里放了一个关于它的网站的链接。 streamcomputing.eu/blog/2015-02-10/… 和我引用“共享虚拟内存:主机和设备内核可以直接共享复杂的、包含指针的数据结构,例如树和链表,提供显着的编程灵活性并消除主机和设备之间昂贵的数据传输。”

标签: linked-list opencl


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多