私は、キャッシュの競合に悩まされ、 "新しい"演算子で割り当てられたいくつかのクラスを持っています。私はどういうわけか "新しい"がアドレスをキャッシュラインに合わせて返すことを確認できますか?C++での偽の共有
私はGCCを使用しています(移植可能でない場合)。
私は、キャッシュの競合に悩まされ、 "新しい"演算子で割り当てられたいくつかのクラスを持っています。私はどういうわけか "新しい"がアドレスをキャッシュラインに合わせて返すことを確認できますか?C++での偽の共有
私はGCCを使用しています(移植可能でない場合)。
:
// Instantiate object into a pre-allocated buffer
obj = new (buf) TheClass();
整列バッファbuf
を取得するには、memalign
、sbrk
またはmmap
を使用することができます。
私は質問と 'mmap'の関係を見ることができません。なぜ 'mmap'ですか? – Frunsi
mmapを使用して整列したメモリのチャンクを割り当てることができます... – mfontanini
glibcまたはwindows CRTシステムにはそれぞれmemalign
または_aligned_alloc
を使用できます。 nedmallocのようなカスタムアロケータを使用してブロックを整列させることもできます。これによりブロックを追加することもできます。
また、静的に割り当てられる場合に備えて、__attribute__((aligned(64)))
とマークする必要があります。
これを解決する最も簡単な方法は、オブジェクトを十分大きくして、キャッシュラインを共有できないようにすることです。あなたはクラスの配置を設定することができ、GCCを使用して(私はあなたが競合に苦しむので、あなたのオブジェクトがキャッシュラインそして小さいと仮定しています):
class foo {} __attribute__((aligned(2 * CL)));
もちろんのCL
のためにあなたのアーキテクチャのための正しいCachelinesizeを挿入する必要があります(またはそこにマクロを置く)。 が実際にアライメントが確実に保持されることを保証しないので、キャッシュラインの2倍のサイズを使用しました。したがって、オブジェクトはキャッシュラインの先頭で開始することが保証されていないので、同じキャッシュライン内の異なるオブジェクトの一部(つまり、1つのオブジェクトの終わりと別のオブジェクトの始まり)を取得できます。整列が常に保存されている場合、__attribute__((aligned(CL)))
は問題ありません。もちろん、これはあなたの構造を変更し、多くのスペースを無駄にする必要があります。
memalign
に基づいて、new
(その方法はhereと表示)を書くこともできます。より頑丈なソリューションの場合は、memalign
を直接使用して、配置されたスペース内にオブジェクトを配置することもできます。もちろん、これらのオブジェクトを使用してコードを良くしていません。あなたは、メモリの所定の領域にオブジェクトを構築するためにplacement new
を使用することができます
キャッシュラインは、通常64バイトです。かなり小さいクラスを持っていなければならないので、たくさんのきわめて小さな動的割り当てを実行する必要がありますか? –
いくつかは小さいですが、ほとんどが(キャッシュラインで)重複しています。 – jk4736
インスタンスを個別にまたは配列に割り当てますか? – dasblinkenlight