Cで小さなアプリケーションを作成しました。
- 5MBの2つの文字バッファを割り当てます。
- 1000回繰り返す
- array1またはarray2のすべての要素はループ内で合計(交互)であるため、内部ループでは500万の追加が行われます。
- この内部ループの時間を測定します(時計の鍛造)。
- 内部ループに必要な最小/最大時間と平均時間を確認してください。
驚くべきことに、IMX8のジッタ係数はほぼ1.6..2.0なので、1000個のループのうちの1回は約4.5ms、少なくともほぼ9msです。平均は約4.6ミリ秒ですが、時間がかかるのは1つまたは2つのループではありません。
これはスケジューラの設定とは関係がないため、スケジューラ FIFO とは関係ありません。周波数スケーリングは有効ではありません。コア数に依存しません。
バッファはRAM(512MB)に入るのに十分小さいが、レベル1/2キャッシュに収まらないほど大きい。
このジッタの原因が何であるかよくわかりません。 Zynqプロセッサを使用する従来のシステムでは、ジッタがほとんどありませんでした。
-O3 でコンパイルします。 -O0を使用するとジッタはありませんが、実行は非常に遅いです(ループには5msではなく50msかかります)。
Trace-cmdを使って何が起こっているのかを調べようとしていますが、実際に結果を読むことはできません。フィルタリングする必要があります。そうしないと、多くのイベントが失われます。しかし、何を探すべきですか?どんなアイデアがありますか?
また、これを行うには、1つのコアを取り外してみてください。結果は似ています。だから私はスケジューラを信頼していませんが、メモリサブシステムに問題があります。