C++17で標準ライブラリ <new> ヘッダに追加された hardware_destructive_interference_size
, hardware_constructive_interference_size
について。
- hardware_destructive_interference_size
- False-Sharing発生を防ぐために必要となる、最小のメモリアドレス距離。2つの変数を異なるキャッシュラインに載せるためのアライメント情報として用いる。
- hardware_constructive_interference_size
- 同一キャッシュラインに載りうる(True-Sharing)、最大のオブジェクトサイズ。複数変数アクセスの時間的局所性が高いときに、アドレス配置の確認情報として用いる。
対象プロセッサのL1キャッシュラインサイズ(相当)を、コンパイル時定数として取得可能。具体的な値は処理系定義(implementation-defined)とされる。通常、両定数値は同一となる。例:x86アーキテクチャでは値64。WebAssemblyなどコンパイル時に対象アーキテクチャが定まらない場合を想定し、保守的に振舞えるよう目的別に分離定義される。
C++17 21.6.5よりExampleコード片を引用(一部改変)。
#include <new> // hardware_destructive_interference_size利用例 struct keep_apart { alignas(hardware_destructive_interference_size) atomic<int> cat; alignas(hardware_destructive_interference_size) atomic<int> dog; }; // hardware_constructive_interference_size利用例 struct together { atomic<int> dog; int puppy; }; struct kennel { // Other data members... alignas(sizeof(together)) together pack; // Other data members... }; static_assert(sizeof(together) <= hardware_constructive_interference_size);
2018年8月現在、MSVC 14.11(VisualStudio 2017 15.3)*1+/std:c++17オプション でのみ実装を確認*2。GCC(trunk)/libstdc++*3, Clang(trunk)/libc++*4は未対応*5。
おまけ:システムプログラミング言語であるRustにも同様の定数値が提案されている。
どうでもいいメモ:C++17現在、hardware_constructive_interference_size
は atomic_compare_exchange_strong_explicit
と並んでC++標準ライブラリ内で最も長い識別子名となっている。39文字。
関連URL
- P0154R1 constexpr std::hardware_{constructive,destructive}_interference_size
- Understanding std::hardware_destructive_interference_size and std::hardware_constructive_interference_size
- C++標準化委員会の文書のレビュー: P0144R0-P0159R0
- C++1z false sharingとtrue sharingの制御
- Clang Developers - [RFC] C++17 hardware constructive / destructive interference size
- cppreference std::hardware_destructive_interference_size, std::hardware_constructive_interference_size
*1:https://cpprefjp.github.io/implementation.html#visual_cpp
*2:https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/
*3:https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/testsuite/18_support/headers/new/synopsis.cc