3

効果的に並列化できる非常にプロセッサ集約的なタスクが手元にあるとします。そのタスクを実行するために、利用可能なすべてまたはほとんどすべてのプロセッサー能力を どのように専念させることができるでしょうか?

タスクはさまざまなものになる可能性があり、記録された数値を保存する反復的なフィボナッチ数の生成はその一例にすぎません。

4

4 に答える 4

3

ターゲット環境について提供した詳細が少なすぎる可能性があります。

通常、RTOS を使用する場合、割り込みを無効にしてスケジューラも割り込みサービス ルーチンも実行しないようにするか、タスク ロックを適用してスケジューラを実行しないようにすることができますが、ISR は引き続き実行されます。タスクの優先度を最高の優先度に引き上げることで、タスク ロックと同じ効果を得ることができます。

RTOS を使用していない (または OS を使用していない) 場合、通常、スケジューリングをそれほど制御することはできませんが、スレッドが譲歩せずに実行され (つまり、スレッドを待機させる関数を呼び出す)、他のスレッドやプロセスがそうでない場合は、多くのサイクルが必要な場合、スレッドはほとんどすべての CPU を取得します。たとえば、Windows のビジー ループは、他のプロセッサを集中的に使用するタスクを実行していない場合、ほとんどの場合、タスク モニターで 1 つのコアの使用率が 100% として表示されます。プロセッサに複数のコアがある場合は、何らかの方法でタスクを並列化して、それらすべてを使用できるようにする必要があります。

通常、I/O 呼び出しはスレッドのブロックを引き起こすため、結果を「保存」する必要があると問題が発生する可能性があります。解決策は、結果をメモリに (直接またはキューまたは書き込みキャッシュとして) バッファリングし、すべての計算が完了するまで出力を延期することです。

于 2010-05-23T08:46:48.887 に答える
0

オペレーティング システムは、CPU の割り当てを処理します。ほとんどの場合、プログラムがより多くの電力を必要とする場合はそれを取得しますが、優先度の高い (Linux では「良い」) プロセスは、CPU 時間要求のキューで高くなります。

于 2010-05-22T04:58:45.633 に答える
0

それは、プロジェクトのコンテキストと、プロセッサで実行されている他のタスクに大きく依存します。

次の2 つの例を考えてみましょう。

1/ プロセッサは、いくつかの優先度の低いジョブのみを実行しています。たとえば、通信レイヤーが待機しているため、計算中 (プロセッサ集中型タスク) は気にしない、USB、CAN、SPI などの通信としましょう。このタスクの出力。次に、このタスクに非常に高い優先度を (使用しているオペレーティング システムに応じて静的または動的に) 割り当てることができます。また、利用可能な同期 (メッセージ、タスクの一時停止など) によって他のタスクを停止することもできます。

2/ プロセッサは優先度の高いジョブを実行しているため、マイクロプロセッサの残りの電力を消費するため、タスクの優先度を低くすることができます。それで十分です。

したがって、タスクに優先順位を割り当てる方法について質問があるかもしれません...しかし、それはすべて、ファームウェアアーキテクチャと、オペレーティングシステムまたは大きな「メイン」の間で手動で行った選択に依存します!

正確な回答が必要な場合は、詳細をお知らせください。

于 2010-05-22T21:19:46.947 に答える
0

不要なプロセスをすべて削除します。

このプロセスまたは他のプロセスによって引き起こされるすべてのディスク アクセスおよびその他のブロッキング IO をオフにします。これを行う必要がある場合は、後で実行し、バッチ処理します。並列スレッドで複数のコアを使用し、CPU とプロセスまたはコアとプロセスのアフィニティを設定すると役立つ場合があります。最後のものはおそらく OS 固有です。

プロセスの優先度を高く設定して、より大きなシェアを獲得します。

于 2010-05-23T08:59:35.110 に答える