2011-07-07 17 views
3

非常に大きな配列内のすべてのエンティティにいくつかのデフォルト値を設定する必要があります。 かなり長い時間がかかります(110-120ミリ秒)、メモリ不足のために起こると思われます。配列変数(unsigned int *)がメモリ上にあることを確認する方法はありますか?

memset/std:fillを使用してデフォルト値を設定します。 memset/fillの前に配列がメモリに常駐することを確認する方法はありますか?

+3

何を意味するのに役立つだろうか?居住者?ページテーブルにマップされていますか?キャッシュで? L1では? – bdonlan

+0

また、どのOSをターゲットにしていますか? – bdonlan

+0

"misses in memory"とは、ページフォールトを意味しますか? – hammar

答えて

1

これは大きなメモリマップファイルであると仮定すると、MADV_WILLNEED引数を持つmadvise() libc呼び出しを使用して、すぐに言及した領域にアクセスする予定のOSをヒントできます。

しかし、YMMVの場合、結果として生じるシステムコールの利点がコールを行うコストよりも上回らないように、配列を十分に大きくする必要があるため、YMMV。

0

mlockを使用して、ページ単位のグラニュラリティでメモリをロックすることはできますが、一定量までです(OS Xの制限はわかりませんが、RLIMIT_MEMLOCKgetrlimitを使用して確認できます)。

0

ほとんどの場合、複数のコアプロセッサを搭載しており、memsetのような機能は、シングルコアCPUで使用されていないと性能が実際に低下します。 mutexロックが減速の原因になっている可能性があります。ダイナミックメモリの代わりにスタックにメモリを割り当ててみてください。それは非常に大きな配列なので、私は自分自身のメモリマネージャを作り、それを複数のスレッドに格納することを試みます(しかし、これは速く記事を読んだ後のアイデアです)。これを行う標準的な方法は、スレッドごとに1つのメモリアロケータを使用することです。いずれにせよ、私はmemset以外の何かを調べます。

たぶん次 aticleでは、「メモリー内」で

+0

最新のOS XはOPごとに)スタックへの書き込みには何も特別なものはありませんヒープ - それは(仮想)メモリ内の単なるページなので、memset()をスタックメモリ上で呼び出す速度に違いはありません。ヒープメモリ。 – DaveR

+0

また、OS Xの汎用[memset](http://www.opensource.apple.com/source/Libc/Libc-594.9.5/string/memset-fbsd.c)ルーチンまたは[x86-64](http://www.opensource.apple.com/source/Libc/Libc-594.9.5/x86_64/string/memset.s) – DaveR

+0

@Daveスレッドは自律的ですが、スティルはメモリアロケータが1つしかないので、スレッド間に競合が発生します。 –

関連する問題