6
使用新的C++ 11对齐工具我想确保一组临时(堆栈)变量位于一个缓存行中。我第一次天真的尝试如下:缓存对齐的堆栈变量
int main() {
alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64
int b; // 0x7fffc58aac7c
int c; // 0x7fffc58aac78
return 0;
}
笨我!堆栈不以这种方式分配变量,因此a
将位于不同的缓存行上,而不是b
和c
。
这是否意味着正确对齐多个变量的唯一方法是通过聚合?
struct alignas(64) Abc {
int x;
int y;
int z;
};
int main() {
Abc foo;
// x 0x7fff40c2d3c0 (aligned at 64)
// y 0x7fff40c2d3c4
// z 0x7fff40c2d3c8
return 0;
}
编译:锵3.2
你真的认为在同一个缓存行中拥有所有这些变量都会提高性能吗?堆栈在缓存中的可能性相当不错。 – 2013-03-24 01:13:33
如果这些变量需要在多个内核之间共享,那么无论哪个内核想要写入这些内核,都需要一次使用全部三个变量。如果它们全都位于同一个缓存行中,并且访问这些变量很少,则一致性流量将会减少。但是,不能保证在读取同一行中的两个变量之间该行可以失效。 – 2013-03-24 13:14:40
现代编译甚至不会将堆栈变量保存在固定位置(当然,除非您拿到地址)。因此,如果'a'和'b'共享一个缓存行,写入任何一个可以改变的行后。 (这是典型的静态单一分配优化) – MSalters 2013-03-24 18:56:52