我最近在我的应用程序中遇到了我认为是虚假共享的问题,并且我查询了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/

10-11 04:37