Rustでキャッシュを意識したデータレイアウト:フィールドゾーニングと128バイトルール
Cache-Conscious Data Layout in Rust: Field Zoning, False Sharing, 128-Byte Rule
マルチスレッド構造体のパフォーマンスは、キャッシュラインの共有が鍵を握る。2つのコアが異なるフィールドを書き込んでも、同じキャッシュラインを共有すると偽共有が発生し、ロックフリーのコードでも性能が低下する。この記事では、SPSCリングバッファを例に、書き込みオーナーとアクセス頻度でフィールドをグループ化する「フィールドゾーニング」と、`#[repr(C)]`と`CacheAligned`によるアライメント調整で偽共有を防ぐ方法を解説。さらに、128バイトアライメントの理由、ソフトウェアプリフェッチの逆効果、`repr(C)`の注意点など、実践的な知見を提供する。
2つのコアが64バイトのキャッシュラインを共有する異なるフィールドに書き込むと、ハードウェアのコヒーレンスプロトコルを通じて静かに互いに直列化される——これが偽共有と呼ばれる病理です。