マルチコア環境における並列化有効ポイント組み込みマルチコア進化論(2)(1/3 ページ)

リアルタイム性の向上に着目して、並列化を行うには!? 並列化の有効ポイントについて検証してみよう

» 2008年12月18日 00時00分 公開
[塚田 雄一 キャッツ,@IT MONOist]

はじめに

 マルチコア分割(並列化)手法を読者の皆さんと進化させていくために、前回は、「マルチコアで並列化する前に考えること」というテーマで、マルチコア化を行う際の前提知識を紹介しました。今回は、マルチコアにおける並列化について、並列化を検討する際の有効ポイントを紹介したいと思います。

 並列化するための有効ポイントは、「並列設計されている部分のマルチコア化」と「リアルタイムOSのタスク割り当て」の2つになります。

 並列設計されている部分のマルチコア化は、そもそも並列処理を想定して開発されたものが、シングルコアで動作するために逐次処理されてきた部分です。このパターンは並列化されるべきポイントであったため、マルチコア化を検討するうえで有効なポイントです。

 リアルタイムOSのタスク割り当ては、リアルタイムOSの環境において、タスクを各コアに割り当てる方法です。リアルタイムOSはタスク別に機能が分割されているために、タスクは単独で動作することが前提となっています。また、タスク間の依存関係はタスク間通信により明確となっています。

 リアルタイム性のほかに処理の高速化を考えた場合は、ホットスポット(処理時間が長い部分)に着目し、高速化を検討することが有効となります。

 それでは、これらの手法を紹介します。

並列設計されている部分のマルチコア化

 並列設計されている部分については、組み込み開発で広く使われている状態遷移表(STM:State Transition Matrix)を基に説明します。

 状態遷移表は、縦軸がステートと呼ばれる「状態」になり、横軸がイベントと呼ばれる「事象」になります。そして、その縦軸と横軸の交わったセルに、アクションと呼ばれる「処理」と、トランジションと呼ばれる「遷移」が記述されたものになります。図1に簡単な例を示します。

状態遷移表 図1 状態遷移表

 まず、ステート(状態)が「電源OFF」の際に、ONスイッチというイベント(事象)が発生した際には、電源ON処理(アクション)を行い、電源ON状態に遷移します。その状態で、再度電源ONの処理を行った場合には、処理は行われず、OFFスイッチというイベント(事象)が発生した際には、電源OFF処理(アクション)を行い、電源OFF状態に遷移します。

 次に、状態遷移表を拡張させた考え方で「拡張階層化状態遷移表」があります。これは並列処理を考えて設計を行うためのものです。簡単な例として、テレビ電話を考えてみてください。図2ですが、テレビ電話は、テレビを見ながら電話で会話をするというものなので、テレビの機能と電話の機能は常に並列で動作しています。

拡張階層化状態遷移表 図2 拡張階層化状態遷移表

 並列処理1と並列処理2は並列に動作が行われており、イベント1の事象が発生した場合に、並列処理1と並列処理2を並列して、両方の処理が行われます。テレビ電話の場合は、イベントが発生した際にテレビと電話、両方の処理が実行されます。詳しくは、『拡張階層化状態遷移表設計手法Ver.2.0』(キャッツ)を参照ください。


 そもそもシングルコア環境では、同時(並列)処理が不可能であったために、マルチタスクOSのスケジューリングのように、処理を順番に行う以外に動作できませんでした。しかしマルチコア環境の場合には、並列実行が可能となります。

状態遷移表を使用する際の注意点

 マルチコアで動作するように設計した際には、データ(資源)の共有と、同期タイミングについて検討しなくてはなりません。前回デッドロックについて説明しましたが、そのほかに、データレーシング、データ競合問題など、データ(資源)を共有するための注意点がいくつかあります。

 また処理の順序を考えた場合、各処理の同期タイミングを考える必要があります。これらは各処理の依存関係を明確化し、その依存関係における動作順序を検討する必要があります。例えば現在の組み込み開発では、電話機とプリンタとFAXが1つの機種で実現されています。各機能は並列処理が可能ですが、FAX受信中は通信回線が使用中であるため電話の機能は使用できず、同じくFAX受信中で印刷機能を使用中には、プリンタの機能は使用できないなど、共有資源を使用する際には、各処理の状態設計をする必要があります。ほかに処理が行われるのを禁止する際は、処理をロックし、処理可能とする場合には、アンロックするなどの排他制御を検討していく必要があります。

リアルタイムOSのタスク割り当てについて

 次に、リアルタイムOSのタスク割り当てについて考えてみましょう。組み込み開発では、イベントドリブンのシステムが多く、イベントから応答を返すまでの時間、つまりリアルタイム性が重要になってきます。

 シングルコアでイベントからの要求応答処理が8つ存在する場合、優先度は1〜8の8段階になります。それをデュアルコアにした場合、それぞれのCPUに4つずつ要求応答処理を割り当てることが可能になります。つまり、1つ目のCPUの優先度は1〜4の4段階で、2つ目のCPUの優先度も1〜4の4段階になります。優先度が低く、実行される機会が少なかった要求応答についても、動作可能となる機会が増え、リアルタイム性が向上します。

 各CPUに1タスクを割り当て、常に動作可能状態にするというのが理想ではありますが、実際にはコストの問題もあって、そうはいきません。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.