【问题标题】:char array __attribute__ alignedchar 数组 __attribute__ 对齐
【发布时间】:2018-08-15 10:18:44
【问题描述】:

我对以下代码行有疑问:

char buffer[256] __attribute__((aligned(4096)));

全局数组“缓冲区”的内容是字符串,我从标准输入中获得。 我已经阅读了https://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Type-Attributes.html(gcc/gnu 在线文档)。我知道这个属性以字节为单位指定了变量的最小对齐方式。

我的问题是关于为什么我需要对 char 数组进行这种对齐的原因?

仅仅因为性能原因?

【问题讨论】:

  • 确实有点奇怪。我的猜测是他们希望它分配在 4kib 的某个内存段中。
  • 不幸的是,变量定义本身并不能告诉我们太多。您需要调查 buffer 的用法以尝试获取更多信息。
  • 可能是与页面大小对齐?
  • 请记住,分配为char * 的内容与它的使用方式无关。在您知道这一点之前,对齐几乎可以用于任何事情。例如,numpy 使用 char * 来保存数组数据,无论是原始数据还是指针。

标签: c gcc char memory-alignment


【解决方案1】:

也许使用常量不是最好的主意,至少,在没有很好地解释目标的情况下(看起来示例的页面大小是 4096)。一些架构具有复制大块内存(例如整个页面)的特定指令,这可能会更快地完成该过程:

GCC 还提供了一个目标特定的宏BIGGEST_ALIGNMENT,它是最大的 对齐曾经用于您正在编译的目标机器上的任何数据类型。为了 例如,你可以写: 短数组[3] 属性 ((aligned (BIGGEST_ALIGNMENT)));

编译器自动将声明的变量或字段的对齐方式设置为 BIGGEST_ALIGNMENT。这样做通常可以使复制操作更高效, 因为编译器可以使用任何指令来复制最大的内存块,从而在您以这种方式对齐的变量或字段之间进行复制。请注意,BIGGEST_ALIGNMENT 的值可能会根据命令行选项而改变。

[...]

请注意,对齐属性的有效性可能会受到链接器固有限制的限制。在许多系统上,链接器只能安排变量对齐到某个最大对齐。 (对于某些链接器,支持的最大对齐可能非常小。)如果您的链接器最多只能将变量对齐到 8 字节对齐,那么在 属性 中指定对齐(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

【讨论】:

    【解决方案2】:

    我猜某个特定的硬件希望它以这种方式对齐。 (大容量存储阅读器、DMA 等)。 我必须说很少看到如此大的对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2011-12-18
      • 2015-01-15
      • 2014-05-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多