私はハードウェアパフォーマンスカウンター(HPC)を使用していますが、これらのカウンターを使用して特定のイベントを正確に測定したいと思います。
私はハードウェアパフォーマンスカウンタの不確実性(不正確さ)が次のために発生する可能性があることを発見しました。ページエラー実行時に発生します。ページフォルト数は、命令と分岐数に直接影響します。
私の質問:ソースコードの静的分析を使用してページエラーの数を予測(または計算)する方法はありますか?そうでなければ、これを動的に達成できますか?
答え1
すべてのページエラーのログを絶対に生成できますが、これを確実に予測することはできません。仮想メモリをオフにして、ソフトウェアがRAMまたはL2に適していることを確認してください。おそらくZramが役に立つでしょう。より良い結果が必要な場合は、値を設定してリアルタイムオペレーティングシステムを使用することもできます。
答え2
リアルタイムで処理しなければならないことがあるようです。この場合、ページフォルトが重要ではないことを確認する正しい方法は、これを予測しようとするのではなく(ほとんど不可能)、ページフォルトがいつどこで発生するかを管理することです。
POSIX準拠およびPOSIX様システムでこれを行う最も簡単な方法は、起動時とフラグセットをmlockall()
使用してlibcから関数を呼び出すことです。これは3つのことを行います。MCL_CURRENT
MCL_FUTURE
- これは、プロセスによってマッピングされたメモリが交換されるのを防ぎます(少なくとも呼び出されるまで
munlockall()
)。 - 誤動作を引き起こすみんな現在マップされているページです。最初のポイントと一緒に、これはマップされたメモリ領域へのアクセスがページエラーを生成しないことを意味します。
- 新しくマップされたページがマッピングされると、エラーが発生します。つまり、メモリ割り当て呼び出しは、そのメモリ領域の内容をメモリにインポートするのに必要なページエラーの数だけ正確にトリガされ、割り当てが完了した後の後続アクセスではページエラーはトリガされません。
これは問題のみを解決することに注意してください。あなたのプログラム。システムで実行されている他のコードからまだ干渉を受ける可能性がありますが、残念ながらこれを行うことはあまりありません(リアルタイムの予約優先順位で実行する以外はあまり役に立ちません)。