図3のように「タスク1」「タスク2」「タスク3」の3つのタスクが存在する場合、各タスクはタスクスケジューラによりスケジューリングが行われています。そして、タスク1の内部処理として、条件1の場合には処理1が、条件2の場合には処理2が実行されます。そして条件3の場合には処理3が実行されます。
ここで、処理1、処理2、処理3のリアルタイム性を考えてみましょう。タスク間においては、タスクスケジューリングによってスケジューリングが行われますが、タスク内部の処理においては、スケジューリングが行われません。例えば、処理2に時間がかかる場合、処理2が終了するまでは、条件3が成立しても処理3は実行されません。
処理1と処理3を同一のコアに設定し、処理2を別のコアにアサインしたとします。
処理3は別コアのため、処理2の終了を待たずに、処理を実行することが可能となります。
各タスクについてコアの割り当てを検討する場合、タスクの待ち時間が多く存在する際には性能の向上が期待できません。よって、設計においては、タスクの待ち時間を考慮する必要があります。それには、タスクシーケンス図を描いてみるとよいでしょう。
リアルタイムOSには複数のタスクが存在します。各タスクにはそれぞれ依存関係が存在し、また処理の流れが存在するため、処理シーケンスを含めて、並列化範囲の検討を行う必要があります。処理を表現するためには、UMLの「シーケンス図」が有効です。以下の例で、処理シーケンスを考えてみると、タスク1〜タスク3が並列化を検討するための関連タスクであることが分かります。タスク4については、このシーケンスでは動作しません。
処理の高速化を考えた場合には、「ホットスポット」と呼ばれる処理に一番時間がかかっている部分に着目するのが有効です。1つの処理時間が長いもの、何度も繰り返し処理が行われているものなど、処理の動作に時間がかかっているものを高速化した方が、もともと処理時間の短いものを高速化するよりも効果が大きいためです。
まず一番単純な方法として、純粋にタスクの処理時間を計測し、処理時間が長い部分のタスク抽出を行います。そのタスクに対して、並列化を検討します。以下の場合には、一番処理時間が長いタスク1について、並列化を検討します。
次に、処理のアクセス回数に対して処理時間の検討を行います。純粋に処理時間だけではありません。例えば、タスク1からタスク3については、アクセスが1回で、タスク4については、その間にアクセスが10回であった場合は、10回分の処理時間が必要となります。その場合は、タスク4について並列化の検討を行うことがよいでしょう。
マルチコアの目的には「リアルタイム性の向上」や「処理の高速化」などの性能向上のほかに、「消費電力の削減」などがあります。マルチコアのCPUはイベント待ち時間に低消費電力モードになり、イベントが入った際には、並列で高速処理できるといったシステムになります。
現在、マルチコア環境における並列化手法はまだ確立されているとはいえません。皆さんと一緒に考え進化させていきたいと思います。ご意見、ご質問がある方は件名を「マルチコア並列化手法の件」として、メールアドレスinfo@zipc.comまでご連絡ください。また、参考ホームページはhttp://www.zipc.com/support/rre/multicore/になります。よろしくお願いいたします。
次回もお楽しみに。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.