連載
» 2008年12月18日 00時00分 UPDATE

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

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

[塚田 雄一 キャッツ,@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© 2017 ITmedia, Inc. All Rights Reserved.