キャッシュによる実行時間の変動がないようにコードを実行するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/69049

質問

リアルタイム制約が厳しい組み込みアプリケーション (32 ビット プロセッサ上で C で書かれたもの) では、重要なコード (特に割り込み) の実行時間は一定である必要があります。

時間変動が生じないようにするにはどうすればよいですか 処刑中 特にプロセッサのキャッシュ (L1、L2、L3 のいずれか) によるコードの影響はありますか?

以下の理由により、キャッシュの動作が懸念されることに注意してください。 巨大な 実行速度に与える影響 (場合によっては 100:1 対 100:1 以上)。RAM にアクセスしています)。特定のプロセッサ アーキテクチャによって生じる変動は、キャッシュほど大きくはありません。

役に立ちましたか?

解決

ハードウェアを手に入れることができる場合、またはそれができる人と協力できる場合は、キャッシュをオフにすることができます。一部の CPU には、電源ではなくグランドに接続すると (またはその逆の場合もあり)、すべての内部キャッシュが無効になるピンがあります。これにより予測可能性は得られますが、スピードは得られません。

それができない場合は、ソフトウェア コードの特定の場所で、意図的にキャッシュをジャンクで埋めるように記述できる可能性があるため、次に何が起こってもキャッシュ ミスであることが保証されます。正しく行えば、予測可能性が得られ、おそらく特定の場所でのみ実行できるため、キャッシュを完全に無効にするよりも速度が向上する可能性があります。

最後に、速度が重要な場合は、古代の 8 ビット CPU のプログラミングの昔のようにソフトウェアとデータを慎重に設計し、すべてが L1 キャッシュに収まる程度に小さくしておきます。最近のオンボード キャッシュが、当時 (マンブル 10 年頃) のミニコンピューターのすべての RAM よりも大きくなっていることにいつも驚かされます。しかし、これは大変な作業であり、賢さが必要です。幸運を!

他のヒント

2 つの可能性:

キャッシュを完全に無効にします。アプリケーションの実行速度は遅くなりますが、変動はありません。

コードをキャッシュに事前にロードして「ロックイン」します。ほとんどのプロセッサは、これを行うためのメカニズムを提供します。

リアルタイム システムを念頭に置いて構築されていない x86 プロセッサ ファミリについて言及しているようです。そのため、一定時間実行の実際の保証はありません (CPU は、分岐予測や命令プリフェッチ キューがあるよりも、マイクロ命令を再順序付けする可能性があります)。 CPU が条件付きジャンプを誤って予測するたびにフラッシュされます...)

この答えは冷酷に聞こえるかもしれませんが、次のことを考えさせることを目的としています。

コードは一度だけ実行してください。

私がそう言う理由は、あまりにも多くのことが変化し、制御することすらできないかもしれないからです。そして、あなたの時間の定義は何ですか?オペレーティング システムがプロセスを待機キューに入れることを決定したとします。

次に、キャッシュ パフォーマンス、メモリ遅延、ディスク I/O などによる予測不可能性が発生します。これらはすべて、要約すると 1 つのことです。場合によっては、コードが情報を使用できるプロセッサに情報を取り込むのに時間がかかることがあります。コード自体をフェッチ/デコードするのにかかる時間も含まれます。

また、どの程度の差異が許容されますか?40 ミリ秒で問題ない場合もあれば、10 ナノ秒で問題ない場合もあります。

アプリケーション ドメインによっては、差異をマスクしたり非表示にしたりすることもできます。コンピュータ グラフィックス担当者は、各フレームのレンダリング時間の差異を隠すために、長年にわたりオフスクリーン バッファーにレンダリングを行ってきました。

従来のソリューションは、既知の変動金利のものをできるだけ削除するだけです。ファイルを RAM にロードし、キャッシュをウォームアップして IO を回避します。

重要なコード内のすべての関数呼び出しを「インライン」にし、変数の数を最小限に抑えて、変数に「register」型を持たせることができます。これにより、プログラムの実行時間が短縮されるはずです。(最近のコンパイラは「register」タグを無視する傾向があるため、おそらく特別な方法でコンパイルする必要があります)

メモリから何かをロードしようとしたときにページフォールトが発生しない程度のメモリがあると仮定しています。ページフォールトには時間がかかることがあります。

生成されたアセンブリ コードを調べて、実行中のコードを変更する可能性のある分岐やメモリ命令が多数存在するかどうかを確認することもできます。

コードの実行中に割り込みが発生すると、さらに時間がかかります。割り込み/例外は有効になっていますか?

メモリを事前に割り当て、割り込みがキャッシュに影響を与えないようにします (不可能ですよね)。

/アラン

複雑な操作の最悪の場合の実行時間を理解し、タイマーを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top