0

私は組み込みLinux用のアプリケーションを作成しています。このアプリケーションでは、プロセッサ時間の5%がファイルの読み取りに費やされ、95%がファイルの処理に費やされています。あるスレッドでファイルを読み取り、別のスレッドで処理を続けると、パフォーマンスが向上しますか?

DMAをサポートしているmmcカードから読み取っています。ファイルサイズは20MBで、2kbのチャンクに分割されます。リーダースレッドからチャンクをキューに入れ、プロセッサスレッドで処理します。したがって、キューへの挿入とキューからの削除の間のみ、スレッドの同期が必要です。

私はARM9用にプログラミングしています。

高速シングルスレッド/マルチスレッドである必要があります。

4

7 に答える 7

2

別のスレッドを使用しないことをお勧めします。代わりに、posix_fadvise()を使用して、事前にファイルをさらに読み取るようにLinuxに指示します。プログラムがデータを処理している間、カーネルはDMAを介してファイルを読み取ることができます。

これは、カーネルにデータバッファリング用の十分な空きメモリがあることを前提としています。データ処理がすべてのメモリを使用している場合、カーネルはposix_fadvise()を無視します。

必要な正確な呼び出しは次のようになります。

while( 1 ) {
  ret = read(fd, buffer, 2*1024);
  if( ret < 0 ) abort();
  if( ret == 0 ) break;
  if( ret != 2*1024 ) abort();
  pos += ret;
  ret = posix_fadvise(fd, pos, 8*1024, POSIX_FADV_WILLNEED);
  if( ret ) abort();
  process(buffer);
}
于 2009-11-19T20:13:35.097 に答える
1

確実に知る唯一の方法はそれを試すことです。しかし、プロセッサが必要とするファイルのチャンクを読み取るためにプロセッサが必要であるかのように聞こえます。あなたはプロセッサに縛られているので、あなたが期待できる最も良い改善はそれが読むのにかかる5%の時間です。

2つのスレッドでは、ファイルの次のチャンクを保持してすぐに処理できるようにするためにメモリ内バッファが必要になります。多くの組み込みシステムでは、使用可能なメモリが非常に限られています。

于 2009-11-19T19:13:57.183 に答える
1

現在、readを呼び出すと、データの読み取り中にプログラムがブロックされます。その後、完了すると再び起動し、処理コードが引き継ぐと思います。この期間中、プロセスはスリープ状態にあるため、ブロックされた時刻は「time」を介して「cputime」として表示されません。(これは、使用可能なDMAによって異なります)。

プログラム全体で、そのファイルの読み取りにかかる時間の壁掛け時計の増加が表示される可能性がありますが、CPU時間は減少しません(同期のために増加する可能性があります)。

于 2009-11-19T19:19:34.113 に答える
1

確認したいことがいくつかあります。

  1. 両方のアクティビティを並行して実行できますか?ハードウェア/アーキテクチャによって処理スレッドが他のスレッドをブロックする場合、ゲインはありません。

  2. 期待できる最大のゲインは5%です(アムダールの法則に基づく)。コーディングの複雑さはそれだけの価値がありますか?

ファイルを処理するより効率的な方法を検討することをお勧めします。処理スレッドが実行していることをよく見て、確認してください。

于 2009-11-19T19:20:13.267 に答える
1

読み取り中にデータを処理できるようになると、おそらくある程度の改善が得られますが、必然的にオーバーヘッドも発生します。他の最適化問題と同様に、測定が重要です。

本当の問題は、違いを測定するために何かを実装する価値があるかどうかです。最大5%のゲインの場合、答えはノーだと思いますが、その5%の一部の可能性が、時間に対してどれだけの価値があるかはあなた次第です。

プラットフォームはメモリマップトファイルをサポートしていますか?それはあなたが読書をO/Sに任せることを可能にするでしょう、それはおそらくかなりうまくいくでしょう。

于 2009-11-19T19:22:25.463 に答える
1

データを順番に読み取る場合、カーネルがファイルを先に読み取り、内容をメモリにキャッシュするため、追加のスレッドはおそらく価値がありません。組み込みシステム(MMCがメモリマップされているシステム)用に書き込んでいない限り、ファイルのメモリマッピングはほとんど変更されません(ファイルはいつかメモリにロードする必要があり、これらのロードは、明示的な呼び出しではなく、読み取りの試行によってトリガーされます。 )。

于 2009-11-19T19:37:07.557 に答える
1

についての記事を書きました

マルチスレッドファイルアクセス

ddj.comで。それはおそらくあなたの質問の一部に答えます。

于 2009-11-19T22:22:18.340 に答える