我最近在我的应用程序中遇到了我认为是虚假共享的问题,并且我查询了Sutter's article如何将数据与缓存行对齐。他建议使用以下C++代码:
// C++ (using C++0x alignment syntax)
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] T data;
char pad[ CACHE_LINE_SIZE > sizeof(T)
? CACHE_LINE_SIZE - sizeof(T)
: 1 ];
};
我可以看到
CACHE_LINE_SIZE > sizeof(T)
为true时这将如何工作-struct cache_line_storage
最终只占用了一条完整的缓存行。但是,当sizeof(T)
大于单个缓存行时,我认为我们应该按CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
字节填充数据,以使生成的结构的大小是缓存行大小的整数倍。我的理解有什么问题?为什么填充1字节就足够了? 最佳答案
您不能使用大小为0的数组,因此需要1才能进行编译。但是,该规范的当前草案版本指出,这种填充是不必要的。编译器必须填充结构的对齐方式。
还要注意,如果CACHE_LINE_SIZE
小于alignof(T)
,则此代码格式错误。要解决此问题,您可能应该使用[[align(CACHE_LINE_SIZE), align(T)]]
,它将确保不会选择较小的对齐方式。
关于c++ - 高速缓存行对齐(需要在文章上进行说明),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1744407/