gpt4 book ai didi

c - __attribute__ 中的 x 应该是什么 ((aligned(x)))

转载 作者:行者123 更新时间:2023-12-04 09:33:14 24 4
gpt4 key购买 nike

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

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

最佳答案

基本规则:数据类型应该是本地对齐的。对齐方式应与存储类型所需的字节数相同(四舍五入到 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字节对齐,则禁止数据访问,因此单个字符将具有4字节对齐,即使在允许这种行为的架构上,访问以这种对齐方式存储的数据也可以更快;因此,如果您混合了不同大小的类型,堆栈和结构字段上的局部变量通常会有填充来实现这一点,尽管如果需要,可以更改该行为。

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

一些更宽的指令,如 SSE2(128 位宽)或双浮点数(64 位宽)在对齐 native 宽度时更快(或有时不起作用)(如果您需要加载 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;

关于c - __attribute__ 中的 x 应该是什么 ((aligned(x))),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com