为什么对齐边界大于4?

时间:2014-09-04 08:02:34

标签: c++ compiler-construction

我不明白的是,为什么我们必须在大于4字节的边界上对齐内存中的数据,因为所有其他边界都是4的倍数。假设一个CPU可以在一个周期内读取4个字节,它将会如果数据大8字节并且以4字节/ 8字节/ 16字节等对齐,则性能基本没有差别。

2 个答案:

答案 0 :(得分:5)

当x86 CPU读取double时,它在一个周期内读取8个字节。当它读取SSE向量时,它读取16个字节。当它读取AVX载体时,它读取32。

当CPU从内存中获取缓存行时,它还会读取至少 32个字节。

您假设CPU每个周期读取4个字节是错误的。

答案 1 :(得分:2)

首先:x86 CPU不会只读取4个字节的内容,它们可以在一个周期内读取8个字节,甚至可以使用SIMD个扩展读取更多内容。

但回答你的问题" 为什么对齐边界多于4 ?",假设一个通用架构(你没有指定一个和{{3我会提出一个特定的案例:GPU。

如果地址在多个访问大小(you wrote that x86 was just an example)上对齐,则只能访问(存储/加载)NVIDIA GPU内存。当地址与访问大小的倍数对齐时,会出现不同类型的加载和最高性能的加载,因此如果您尝试从内存中加载双精度(8字节),您将拥有(伪代码):< / p>

ld.double [48dec] // Works, 8 bytes aligned
ld.double [17dec] // Fails, not 8 bytes aligned

在上述情况下,当尝试访问(r / w)未正确对齐的内存时,该进程实际上会导致错误。如果你想要速度,你必须提供一些安全保障。

这可能会回答你关于为什么首先存在大于4的对齐边界的问题。在这种架构上,访问大小1始终是安全的(每个地址都对齐1)。对于每个 n &gt; 1,这都不是真的。