2013-03-24 87 views
6

使用新的C++ 11对齐工具我想确保一组临时(堆栈)变量位于一个缓存行中。我第一次天真的尝试如下:缓存对齐的堆栈变量

int main() { 
    alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64 
    int b; // 0x7fffc58aac7c 
    int c; // 0x7fffc58aac78 
    return 0; 
} 

笨我!堆栈不以这种方式分配变量,因此a将位于不同的缓存行上,而不是bc

这是否意味着正确对齐多个变量的唯一方法是通过聚合

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

+8

你真的认为在同一个缓存行中拥有所有这些变量都会提高性能吗?堆栈在缓存中的可能性相当不错。 – 2013-03-24 01:13:33

+0

如果这些变量需要在多个内核之间共享,那么无论哪个内核想要写入这些内核,都需要一次使用全部三个变量。如果它们全都位于同一个缓存行中,并且访问这些变量很少,则一致性流量将会减少。但是,不能保证在读取同一行中的两个变量之间该行可以失效。 – 2013-03-24 13:14:40

+1

现代编译甚至不会将堆栈变量保存在固定位置(当然,除非您拿到地址)。因此,如果'a'和'b'共享一个缓存行,写入任何一个可以改变的行后。 (这是典型的静态单一分配优化) – MSalters 2013-03-24 18:56:52

回答

4

要准确对齐,您必须使用聚合几个变量,因为自动变量的布局没有定义。在C++ 11标准中我找不到任何东西,它说自动存储的变量必须按照它们定义的顺序在堆栈上分配。该标准的第5.9节坚持只定义了几种指针比较,并且具有自动存储的变量之间的比较不在所列出的定义范围之内。