-4

キャッシュをフラッシュした後にC++プログラムを実行したいのですが、プログラムを実行する前に、キャッシュに何があるのか​​わかりません。プログラムを実行する前にキャッシュをフラッシュする方法がUbuntuのC++にありますか?

編集:キャッシュをフラッシュする動機は...プログラムを実行するたびに、現在のデータ構造がキャッシュに存在しないようにすることです...つまり、コールドキャッシュが必要です...すべてのアクセスが必要ですディスクから作られています。

これを達成する1つの方法は、コンピューターを再起動することです...しかし、実行しなければならない実験の数を考えると、これは私には実行可能ではありません。だから、私がこれをどのように達成できるかについて、誰かが私を導くのに十分親切にすることができますか?

4

2 に答える 2

2

ユーザーモード(非カーネルモード)プログラムからキャッシュをフラッシュする必要はありません。OS(Linux、ubuntuの場合)は、他のプログラムからの「残り物」がなく、アプリケーションに新しい仮想アドレス空間を提供します。特別なOSシステムコールを実行しないと、プログラムは他のアプリケーションで使用されているメモリに到達することさえできません。したがって、キャッシュの観点からは、アプリケーションは、それに関する限り、クリーンな状態から開始します。cacheflush()システムコールがあります(構文はOSによって異なります)が、一般的なユーザーモードアプリケーションで異常なことをしているのでない限り、キャッシュが存在することさえ忘れることができます。プログラムを高速化するためだけにあり、OSはCPUのMMUを介してプログラムを管理します。アプリは、プログラムを管理する必要はありません。

「メモリリーク」(アプリケーションが解放/削除するのを忘れたアプリケーションに割り当てられたメモリ。これは、アプリケーションがそれを忘れると「永久に失われる」)についても聞いたことがあるかもしれません。(潜在的に)実行時間の長いプログラムを作成している場合、メモリリークは間違いなく懸念事項です。ただし、リークされたメモリは、それをリークしたアプリケーションの問題にすぎません。最新の仮想メモリ環境では、アプリケーションAがメモリをリークしても、アプリケーションBには影響しません。アプリケーションAが終了すると、OSは仮想アドレス空間をクリアし、リークされたメモリはその時点でシステムによって再利用されます。システムリソースをより長く消費します。多くの場合、プログラマーは特にメモリ割り当てを解放/削除しないことを選択します。アプリケーションが終了すると、OSがメモリの全量を自動的に再利用することを知っています。プログラムが仮想アドレス空間を使い果たして繰り返し実行し続けない限り、その戦略に問題はありません。

于 2012-06-29T23:20:08.937 に答える
0

これはよくある質問です。

まず、レジスタが実際に空になることはなく、常にそこにあり、常に値を持つのと同じように、キャッシュが実際に空になることは決してないことを理解する必要があります。「キャッシュのフラッシュ」というフレーズは、実際にはキャッシュの内容をメモリに書き込むことを意味し、メモリバリアとも呼ばれます。https://en.wikipedia.org/wiki/Memory_barrierを参照してください

これはあなたの問題ではないので、間違った用語を使用しています。

本当に必要なのは、キャッシュを間違った値で埋めることです。あなたは通常あなたの友達であるすべての最適化と戦っているので、これは思ったより難しいです。ただし、メモリの大きなブロック(数MB-今日のキャッシュのサイズを考えると)をMemcpyすることは通常は機能するはずです。
ただし...
アプリケーションに不当な利点を与えるファイルキャッシュやその他のものもあります。これは非常に複雑なテーマになる可能性があり、それ自体が小さなプロジェクトです。

于 2018-04-06T16:44:36.393 に答える