OpenCL 缓冲区大小填充

Posted

技术标签:

【中文标题】OpenCL 缓冲区大小填充【英文标题】:OpenCL Buffer Size Padding 【发布时间】:2013-02-21 19:08:30 【问题描述】:

当我在 OpenCL 中有一个内存缓冲区时,我知道我需要将其中的数据对齐到 16 字节边界。 但是,如果我的整个数据(不是数据结构,实际的数据集合)只有 15 个字节大,我该怎么办? 我应该将它放入 16 字节的大缓冲区还是 15 字节的大缓冲区? 有性能差异吗?

【问题讨论】:

那么,您正在运行一个只有 15 字节输入的内核?那是一个不好的例子。如果您运行的 X*16+Y 字节不是 16 的倍数,则更合理。 是的,数据大于 15 个字节。但不是 16 的倍数。 【参考方案1】:

如果您要使用许多 15 字节的数据结构并计划使用本地内存,我建议保留 15 字节的结构并一次加载其中 16 个的倍数。我认为“许多”在您的工作组中至少是几 kb 的数据。这样做的原因是,当您为每 15 个字节牺牲额外的字节时,您会增加 6% 的传输开销。将大小保留为 15 还有助于在将数据写回内存(本地和全局内存)时避免存储库冲突。

More info about bank conflicts.

【讨论】:

15 字节结构的数组可能不会对齐,并且访问时间会很长。我建议将其保持为 16(尤其是因为大多数设备(包括 GPU)的自然对齐是 16 字节)。当然,这是性能/内存的权衡。我也看不出结构的大小与银行冲突有什么关系,如果由于未对齐的加载/存储而使它们变得更糟的话。 让我澄清一下:在我的示例中,没有 15 字节的数据结构(我从未说过任何关于结构的事情)。整个数据为 15 字节。它不一定只有 15 个字节大。它可以是任何不是 16 的倍数的数字。

以上是关于OpenCL 缓冲区大小填充的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL - clCreateBuffer大小错误。可能的工作?

OpenCL 部分缓冲区 DMA 读/写

OpenCL 并行缓冲区压缩障碍问题

OpenCL并行缓冲区压缩障碍问题

如何在OpenCL中使用缓冲区分配和映射内存机制?

OpenCL 多 GPU 缓冲区读取失败