Linux と 8 コア x86 プラットフォームを使用しています。まず、キャッシュ ラインのサイズを確認する方法を教えてください。
$ getconf LEVEL1_DCACHE_LINESIZE
64
値をマクロ定義としてコンパイラに渡します。
$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...
実行時 sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
L1 キャッシュ サイズを取得するために使用できます。
サイズを知るには、プロセッサのドキュメントを使用して調べる必要がありますが、プログラムでそれを行う方法はありません。ただし、プラス面としては、ほとんどのキャッシュ ラインが Intel 規格に基づく標準サイズです。 x86 のキャッシュ ラインは 64 バイトですが、誤った共有を防ぐために、対象とするプロセッサのガイドラインに従う必要があります (インテルはネットバースト ベースのプロセッサに関する特別な注意事項をいくつか持っています)。通常、このためには 64 バイトに調整する必要があります。 (Intel は、16 バイトの境界を越えないようにする必要があるとも述べています)。
C または C++ でこれを行うには、標準の aligned_alloc
を使用する必要があります 関数または __attribute__((align(64)))
などのコンパイラ固有の指定子の 1 つ または __declspec(align(64))
.構造体のメンバー間をパディングして異なるキャッシュ ラインに分割するには、次の 64 バイト境界に整列するのに十分な大きさのメンバーを挿入する必要があります
もう 1 つの簡単な方法は、/proc/cpuinfo を cat することです:
grep cache_alignment /proc/cpuinfo
キャッシュラインのサイズを取得する完全に移植可能な方法はありません。ただし、x86/64 を使用している場合は、cpuid
を呼び出すことができます サイズ、キャッシュラインのサイズ、レベル数など、キャッシュについて知る必要があるすべてを取得するための指示...
http://softpixel.com/~cwright/programming/simd/cpuid.php
(少し下にスクロールします。このページは SIMD に関するものですが、キャッシュラインを取得するセクションがあります。)
データ構造の整列に関しては、完全に移植可能な方法もありません。 GCC と VS10 では、構造体のアラインメントを指定する方法が異なります。「ハッキング」する方法の 1 つは、必要なアラインメントと一致するまで、未使用の変数を構造体に埋め込むことです。
mallocs() を調整するために、すべての主流のコンパイラには、その目的のために調整された malloc 関数もあります。