2011-07-29 16 views
1

"cache sloshing"を避けるために、キャッシュ内に適切な変数alignemtを持つマルチスレッドCプログラムを作成したい。私は/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_sizeからキャッシュラインの長さを取得するので、私は完全なキャッシュラインを占有するように私のアレイを埋め込む方法を知っています。キャッシュラインの先頭の変数

しかし、配列がと正確にに割り当てられていることを確認するにはどうすればよいですか?それとも自動ですか? (自動であれば、パディングは気にしません...)

+0

通常の警告:これは本当に重要ですか?早すぎる最適化をしていませんか? –

+0

最適化よりも好奇心についての詳細 –

答えて

3

メモリを特定のアライメントで割り当てるには、posix_memalignを使用してください。

(私はメモリアロケータはいえ、自動的にキャッシュ・ライン境界に割り当てることが十分にインテリジェントであるかどうかわかりません。)

+0

+1しかし、おそらく、その名前はそれがシステム依存であることを示しているはずです。 OPは彼がPOSIXシステムにいると明示的に言っていませんでした。 –

+0

また、これはヒープ上の割り当てにのみ機能します。 –

0

私が直接これを確実に移植標準C関数があるとは思いません。これを実行するポータブルな方法は、必要以上にメモリを割り当ててから、実際に使用する部分をアライメント要件を満たす最初のアドレスにオフセットすることです。これは、ヒープとスタックメモリで同様に機能します。

この問題の短所は、メモリが不足している場合は、元のメモリのどこかにポインタを置いて、後でfreeを使用する必要があるということです。

+0

したがって、 'p2 = p + line_length-p%line_length'のようなポインタの値を持つ「トリック」は、適切なアライメントと同じでしょうか? –

+0

セグメント化されていないメモリを持つアーキテクチャでは、その方向の何かがそれをすると思います。しかし、望む結果を得るには 'char * 'との間でやりとりする必要があります。セグメント化されたメモリでは、バッファの開始点に向かってセグメントの境界がある場合、もっと注意する必要があります... –

関連する問題