我对以下代码行有疑问:
char buffer[256] __attribute__((aligned(4096)));
全局数组“ buffer”的内容是字符串,我是从stdin获得的。 我已阅读https://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Type-Attributes.html(gcc / gnu在线文档)。我知道此属性指定了以字节为单位的变量的最小对齐方式。
我的问题是为什么我需要为char数组进行这种对齐的原因?
仅仅是因为表现原因?
答案 0 :(得分:0)
也许,使用常数并不是最好的主意,至少在没有关于目标的很好解释的情况下(示例的页面大小为4096)。某些体系结构具有用于复制大块内存(例如整个页面)的特定说明,这可能会更快地完成该过程:
GCC还提供了特定于目标的宏 BIGGEST_ALIGNMENT ,这是最大的宏 用于您要编译的目标计算机上任何数据类型的对齐方式。对于 例如,您可以编写: 简短数组[3] 属性((对齐( BIGGEST_ALIGNMENT ))))
编译器会自动将声明的变量或字段的对齐方式设置为 BIGGEST_ALIGNMENT 。这样做通常可以提高复印操作的效率, 因为在执行以这种方式对齐的变量或字段或从中进行复制时,编译器可以使用任何指令来复制最大的内存块。请注意, BIGGEST_ALIGNMENT 的值可能会有所变化,具体取决于命令行选项。
[...]
请注意,对齐属性的有效性可能会受到链接器中固有限制的限制。在许多系统上,链接器仅能够安排将变量对齐到最大对齐程度。 (对于某些链接器,支持的最大对齐方式可能非常小。)如果链接器只能对齐最大8字节对齐方式的变量,则在属性中指定aligned(16) >仍然仅为您提供8字节对齐。有关更多信息,请参见您的链接器文档。
出于完整性考虑,它希望确保将数组设置在一页中,以提高性能。
此链接说明如何对对齐的页面数据(在这种情况下,使用aligned_malloc
)来改进代码:https://software.intel.com/en-us/articles/getting-the-most-from-opencl-12-how-to-increase-performance-by-minimizing-buffer-copies-on-intel-processor-graphics
答案 1 :(得分:0)
我猜想特定的硬件希望它以这种方式对齐。 (大量存储读取器,DMA等)。 我必须说很少见到这么大的对齐方式。