最近、自分のアプリケーションで false-sharing と思われる問題に遭遇したので、データをキャッシュラインに合わせる方法に関するSutter の記事を調べました。彼は次の 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 の場合、これがどのように機能するかがわかります。構造体cache_line_storage
は、メモリの 1 つの完全なキャッシュ ラインを占有するだけです。ただし、が 1 つのキャッシュ ラインよりも大きい場合は、結果の構造体のサイズがキャッシュ ライン サイズの整数倍になるようにsizeof(T)
、データをバイト単位でパディングする必要があると思います。CACHE_LINE_SIZE - T % CACHE_LINE_SIZE
私の理解の何が問題になっていますか?なぜ 1 バイトのパディングで十分なのですか?