4

In an embedded application (written in C, on a 32-bit processor) with hard real-time constraints, the execution time of critical code (specially interrupts) needs to be constant.

How do you insure that time variability is not introduced in the execution of the code, specifically due to the processor's caches (be it L1, L2 or L3)?

Note that we are concerned with cache behavior due to the huge effect it has on execution speed (sometimes more than 100:1 vs. accessing RAM). Variability introduced due to specific processor architecture are nowhere near the magnitude of cache.

4

6 に答える 6

2

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

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

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

于 2008-09-16T04:19:16.217 に答える
2

Two possibilities:

Disable the cache entirely. The application will run slower, but without any variability.

Pre-load the code in the cache and "lock it in". Most processors provide a mechanism to do this.

于 2008-09-16T03:00:56.077 に答える
2

リアルタイムシステムを念頭に置いて構築されていないx86プロセッサフ​​ァミリを参照しているようです。したがって、一定時間の実行を実際に保証することはできません(分岐予測と命令プリフェッチキューがある場合よりも、CPUがマイクロ命令を並べ替える場合があります)。 CPUが条件付きジャンプを誤って予測するたびにフラッシュされます...)

于 2008-09-16T03:06:58.807 に答える
0

この答えは卑劣に聞こえますが、それはあなたに考えさせることを目的としています:

コードを1回だけ実行します。

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

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

また、どの程度の差異が許容されますか?40ミリ秒で大丈夫なのか、10ナノ秒で大丈夫なのかもしれません。

アプリケーションドメインに応じて、差異をさらにマスクまたは非表示にすることができます。コンピュータグラフィックスの人々は、各フレームをレンダリングする時間の変動を隠すために、何年もの間オフスクリーンバッファにレンダリングしてきました。

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

于 2008-09-16T03:09:02.813 に答える
0

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

メモリから何かを読み込もうとしたときにページフォールトが発生しないように、十分なメモリがあると想定しています。ページフォールトには多くの時間がかかる場合があります。

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

コードの実行中に割り込みが発生した場合、時間がかかります。割り込み/例外を有効にしていますか?

于 2008-09-16T03:09:19.800 に答える
-1

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

于 2008-09-16T03:07:46.763 に答える