【问题标题】:what should be x in __attribute__ ((aligned(x)))__attribute__ 中的 x 应该是什么 ((aligned(x)))
【发布时间】:2011-08-04 17:14:50
【问题描述】:

我知道为了提高效率需要变量对齐。我没有得到的是如何确定对齐的正确大小。根据我的理解,对齐值应始终设置为处理器的字长(即 32 位机器上的 4 个字节和 64 位机器上的 8 个字节。)无论数据类型如何,以便处理器读取与地址对齐变量。

例如,为什么有人会做this 之类的事情。我知道这只是一些编程书中的一个问题。使用不同的对齐值(如链接中的对齐值)是否有意义?

【问题讨论】:

  • not-power-of-two 对齐方式非常少见且未得到广泛支持。

标签: c gcc attributes


【解决方案1】:

基本规则:数据类型应该是原生对齐的。对齐方式应与存储类型所需的字节数相同(四舍五入为 2 的幂),例如:

type   size   align (bytes)
char     1       1
short    2       2
int      4       4
float    4       4
int64_t  8       8
double   8       8
long double (x87, 80 bit)  10  16
_float128  16    16
int128_t   16    16

一些架构,例如SPARC,如果数据未按 4 字节对齐,则禁止数据访问,因此单个 char 将具有 4 字节对齐,即使在允许这种行为的架构上,访问以这种对齐方式存储的数据也可以更快;因此,如果您混合了不同大小的类型,堆栈和结构字段上的局部变量通常会使用填充来实现这一点,但如果需要,可以更改该行为。

缓存速度更快,对齐不仅仅是字大小(不是 32 位和 64 位,而是缓存行大小,例如 16 字节或 32 字节或 64 字节)。

一些更宽的指令,如 SSE2(128 位宽)或双浮点(64 位宽)更快(或有时不起作用)用于对齐本机宽度(如果需要加载 128 位数据,则​​应将其对齐到 128 位)。

DMA 和内存分页需要更多的对齐,但这通常是通过指针操作来实现的。

由于 DDR 总线和 GPU 核心内存访问限制非常宽,OpenCL (GPGPU) 有时需要大量对齐:http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/attributes-variables.html

/* a has alignment of 128 */
 __attribute__((aligned(128))) struct A {int i;} a;

【讨论】:

  • 您也可以使用__attribute__((aligned(4096))) 对齐页面边界上的内容...
  • 克里斯·多德,没有。不是所有的编译器都能处理这么大的对齐,所以最好使用memalign
  • 我无法理解为什么数据类型应该是 Nativity 对齐的。
  • Native align 是一些编译器的默认模式,CPU 架构可以额外限制这一点(需要对某些数据进行一些对齐)。这是来自 MSVC msdn.microsoft.com/en-us/library/83ythb65.aspx 的页面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2012-07-31
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多