Memory OpenCL缓冲区大小填充

Memory OpenCL缓冲区大小填充,memory,opencl,padding,memory-alignment,Memory,Opencl,Padding,Memory Alignment,当我在OpenCL中有一个内存缓冲区时,我知道我需要将其中的数据与16字节的边界对齐。 但是,如果我的整个数据(不是数据结构,而是实际的数据收集)只有15个字节大,我该怎么办 我应该将其放入16字节的大缓冲区还是15字节的大缓冲区? 是否存在性能差异?如果您打算使用许多15字节的数据结构,并且计划使用本地内存,我建议保留15字节的结构,并一次加载其中16个的倍数。我认为“许多”在您的工作组中至少有几kb的数据。这样做的原因是,当每15个字节牺牲额外字节时,会增加6%的传输开销。将大小保留为15也

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

但是,如果我的整个数据(不是数据结构,而是实际的数据收集)只有15个字节大,我该怎么办 我应该将其放入16字节的大缓冲区还是15字节的大缓冲区?

是否存在性能差异?

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


一个15字节结构的数组可能不会对齐,访问时间会很长。我建议将其保持在16字节(特别是因为大多数设备(包括GPU)的自然对齐是16字节)。当然,这是性能/内存的权衡。我也看不出结构的大小与银行冲突有什么关系,如果有什么关系的话,它会因为未对齐的加载/存储而使冲突变得更糟。让我澄清一下:在我的示例中,没有15字节的数据结构(我从来没有说过任何关于结构的内容)。整个数据有15个字节大。它不一定只有15字节大。它可以是不是16的倍数的任何数字。那么,您运行的内核只有15个字节的输入?这是个坏例子。如果运行的X*16+Y字节不是16的倍数,则更合理。是的,数据大于15字节。但不是16的倍数。