2013-03-06 92 views
0

当我在OpenCL中有一个内存缓冲区时,我知道我需要将其中的数据与16字节的边界对齐。

但是,如果我的整个数据(不是数据结构,实际的数据收集)例如只有15个字节大,我该怎么办?
我应该把它放进一个16字节的大缓冲区或15字节的吗?
是否有性能差异?OpenCL缓冲区大小填充

+0

那么,你正在运行一个只有15字节输入的内核?这是一个坏榜样。如果您运行的X * 16 + Y字节不是16的倍数,那么更合理。 – DarkZeros 2013-12-18 10:13:11

+0

是的,数据大于15个字节。但不是16的倍数。 – Tara 2013-12-18 12:15:44

回答

0

如果您打算使用许多15字节的数据结构并且您打算使用本地内存,我建议保留15字节的结构并一次加载其中的16个倍数。我认为“很多”在你的工作组中至少会有几kb的数据。原因是因为当你牺牲每15个额外的字节时,你增加了6%的传输开销。将数据写回内存(本地和全局内存)时,将大小保持为15还可以帮助避免银行冲突。

More info about bank conflicts.

+1

一个15字节的结构数组可能不会对齐,并且会产生昂贵的访问时间。我建议将它保持在16位(特别是因为包括GPU在内的大多数设备的自然对齐是16字节)。当然这是性能/内存的折衷。我也看不出结构的大小与银行冲突有什么关系,如果有任何事情因未对齐的加载/存储而变得更糟。 – Thomas 2013-03-07 02:53:12

+0

让我澄清一下:在我的例子中,没有15字节的数据结构(我从来没有说过任何关于结构的东西)。整数数据大小为15个字节。它不一定只有15个字节大。它可以是任何不是16的倍数的数字。 – Tara 2013-03-07 07:35:27