2012-02-19 7 views
9

私は、キャッシュの競合に悩まされ、 "新しい"演算子で割り当てられたいくつかのクラスを持っています。私はどういうわけか "新しい"がアドレスをキャッシュラインに合わせて返すことを確認できますか?C++での偽の共有

私はGCCを使用しています(移植可能でない場合)。

+1

キャッシュラインは、通常64バイトです。かなり小さいクラスを持っていなければならないので、たくさんのきわめて小さな動的割り当てを実行する必要がありますか? –

+0

いくつかは小さいですが、ほとんどが(キャッシュラインで)重複しています。 – jk4736

+0

インスタンスを個別にまたは配列に割り当てますか? – dasblinkenlight

答えて

1

// Instantiate object into a pre-allocated buffer 
    obj = new (buf) TheClass(); 

整列バッファbufを取得するには、memalignsbrkまたはmmapを使用することができます。

+0

私は質問と 'mmap'の関係を見ることができません。なぜ 'mmap'ですか? – Frunsi

+2

mmapを使用して整列したメモリのチャンクを割り当てることができます... – mfontanini

3

glibcまたはwindows CRTシステムにはそれぞれmemalignまたは_aligned_allocを使用できます。 nedmallocのようなカスタムアロケータを使用してブロックを整列させることもできます。これによりブロックを追加することもできます。

また、静的に割り当てられる場合に備えて、__attribute__((aligned(64)))とマークする必要があります。

2

これを解決する最も簡単な方法は、オブジェクトを十分大きくして、キャッシュラインを共有できないようにすることです。あなたはクラスの配置を設定することができ、GCCを使用して(私はあなたが競合に苦しむので、あなたのオブジェクトがキャッシュラインそして小さいと仮定しています):

class foo {} __attribute__((aligned(2 * CL))); 

もちろんのCLのためにあなたのアーキテクチャのための正しいCachelinesizeを挿入する必要があります(またはそこにマクロを置く)。 が実際にアライメントが確実に保持されることを保証しないので、キャッシュラインの2倍のサイズを使用しました。したがって、オブジェクトはキャッシュラインの先頭で開始することが保証されていないので、同じキャッシュライン内の異なるオブジェクトの一部(つまり、1つのオブジェクトの終わりと別のオブジェクトの始まり)を取得できます。整列が常に保存されている場合、__attribute__((aligned(CL)))は問題ありません。もちろん、これはあなたの構造を変更し、多くのスペースを無駄にする必要があります。

memalignに基づいて、new(その方法はhereと表示)を書くこともできます。より頑丈なソリューションの場合は、memalignを直接使用して、配置されたスペース内にオブジェクトを配置することもできます。もちろん、これらのオブジェクトを使用してコードを良くしていません。あなたは、メモリの所定の領域にオブジェクトを構築するためにplacement newを使用することができます

関連する問題