連載
» 2008年11月05日 00時00分 UPDATE

組み込みマルチコア進化論(1):マルチコアで処理時間短縮の前にやるべきこと (1/4)

組み込みシステムでもマルチコアは当たり前。でもソフトウェア開発者はどのように開発を行えばいいの?

[塚田 雄一 キャッツ,@IT MONOist]

マルチコアとは

 高性能化への要求に応えるため、組み込みシステムではこれまでCPUのクロック周波数を高めることで処理能力の向上を図ってきました。しかしその結果、消費電力/発熱量/ノイズなどが増加するという問題が発生しています。こうした課題を解決する技術として現在注目されているのが、CPU内のコアを複数実装して各コアの負荷を減少させる「マルチコア」システムです。組み込みシステムにおいてもマルチコアは当たり前の時代がやって来ました。

 しかしながら、マルチコアに対応したすべての機能(処理)を一から開発するのではコストが掛かり過ぎてしまいます。やはり現実的にはシングルコアで動作していた既存資産を流用した開発が望まれます。つまり既存資産である逐次処理を処理分散させた並列化処理に変更する必要があります。

 実際のところ、ハードウェアがシングルコアからマルチコアに変化したことで、ソフトウェア開発者はどのように開発を行えばよいのか分からず困っているのではないでしょうか。事実、上司からマルチコア環境での開発を要求されて苦労している開発者を見ます。1つのコアを前提に開発されたソフトウェアを2つのコアで動作するために処理を2つに分割するだけでも大きな苦労です。

 並列化手法については10年以上研究されていますが、いまだマルチコア環境における並列化手法は確立されていません。そしてマルチコアにおけるコアの数は今後も増加することが予想されます。この連載を通じて、読者の皆さんとともにマルチコア環境における並列化手法を進化させていきたいと願っています。

マルチコアを400mリレーに例えてみると

 話は少し変わりますが、今年の北京オリンピックで80年ぶりに日本が男子400mリレーで銅メダルを獲得しました。そのリレーに例えて話を進めます。そもそもオリンピックの400mリレーは4人で、第1走者から順番にバトンを持ってトラックを1周走り、次の走者にバトンを渡し、最後(4人目)の走者が1番早くゴールしたチームの勝ちとなります。これらの動作はシングルコアの動作と同様にとらえることができます。バトンは1つしかなく、常に1人の走者のみが走れるという環境です。

 これをマルチコア環境に置き換えると、第1走者から第4走者までがバトンを待たずして走り始めることができます。理論的には、4人が同時に走り始めて同時にゴールすれば、4倍のスピードでゴールできるということになります。

 しかし、コンピュータの場合には4倍のスピードにはなりません。それにはまず、小学校で学んだ掛け算と足し算を合わせた計算に例えて考えてみましょう。掛け算と足し算が合わさっている計算の場合は、まず掛け算を先に計算し、その後に足し算を計算するというルールがあります。例えば第1走者が掛け算を行うとして、第2走者が足し算を行うという場合は、第2走者はバトンを持っていたとしても、第1走者が走り終わるまで走り始めることができません。もしも第1走者の計算結果を待たずして走り始めてしまったら、正しい結果を得ることができません。

 マルチコア環境は、シングルコア環境に比べて複数の処理を並列に動作させることができます。しかし実際には、複数の処理を効率よく並列に動作させるために処理をどのコアに割り当てればよいかを検討することが必要になってきます。

 マルチコアは新しい技術ではありません。先にも述べていますが10年以上の長い間研究されてきました。近年、マルチコアが注目されてきたのはパソコンにおけるCPUクロックの限界が見え始め、マルチコア環境になったという流れがあり、組み込み開発においても同様の理由でマルチコアが注目されてきたというのが真相ではないでしょうか。

パソコン環境と組み込み環境における並列化検討プロセスの違い

 パソコンはユーザーが自由にアプリケーション(処理)をインストールして使用する汎用機器です。そのため、WindowsやLinuxはアプリケーションが追加、削除されても動作しなくてはならないので、コアが複数あったとしても動作するアプリケーションを特定することは困難です。

 それに比べ組み込みソフトウェアは、プログラム(処理)が変更されることは少ないため、処理を特定のコアに割り当てておくことができます。WindowsやLinuxはどのパソコン環境でも動作する必要がありますが、組み込み環境では専用のハードウェア環境で動作するため、特定のハードウェアでのみ動作すればいいということになります。

 従って、パソコン環境とは異なり、組み込み開発においては、設計段階でコアの数を特定して開発を行うということが可能になります。

 また、パソコン環境の場合はパソコンの性能によって大きく変化します。また、リアルタイム性があまり求められてはいません。それに対し組み込み開発は、リアルタイム性が重要となってきます。つまり、組み込み開発を行う場合にはリアルタイム性を考えた機能割り当てを検討する必要があります。

環境 パソコン環境 組み込み環境
OS Windows/Linux リアルタイムOS
アプリケーション 動作するアプリケーションは特定できず、アプリケーションの追加/削除が行われる 専用ハードウェアが搭載されており、動作するアプリケーションは特定される
性能 パソコンの性能によって大きく左右される リアルタイム性など要求性能を達成する必要がある
表1 パソコン環境と組み込み環境の違い

 いままでのシングルコアにおけるソフトウェア開発は、ハードウェア開発の終了後に基板の上で動作確認を行ってきました。しかしマルチコアにおける開発では、ハードウェアの仕様を決定する際にコアの数をいくつにすれば性能要求を達成できるかを検討する必要があります。実際に性能要求を達成するためには、各コアで動作するソフトウェアの構造が大きく影響するため、ソフトウェア処理の並列化(処理分割)を行い、ソフトウェアにおける性能評価を行う必要があります。

 つまりソフトウェア開発においては、実装されているコアの数が決定されなくては性能評価ができず、ハードウェア開発においても並列化によるソフトウェアの性能が分からなければコアの数を決定できないという、「鶏が先か、卵が先か」というような状況になってしまいます。それには、やはりハードウェアもソフトウェアも協調を行い、総合的な視点で仕様を決定しなくてはならなくなってきました。

並列化検討

 マルチコア環境において既存資産である逐次処理から並列化への変更を行う場合、「品質」や「性能」について検討する必要があります。品質については、並列化を行った際に逐次処理での品質を保持しなくてはなりません。並列化にはデッドロック、データ競合などの問題があるため、同期/排他制御については、良く検討する必要があります。また性能については、複数のコアを有効利用して逐次処理よりも性能を向上させる必要があります。しかし処理並列化における依存関係が存在するため、性能を向上させる最適配置を見つけ出すのは困難になります。並列化検討を行う際にはこれらを考慮する必要があります。

並列化を行う目的と問題 図1 並列化を行う目的と問題

 並列化検討では関数の親子関係やループ処理、処理時間の多くかかっているところの「並列化における分割ポイント」、外部変数などの「機能分散における依存関係」などを検討します。そして並列化を行う際には「機能分割」と「同期タイミング」、セマフォやロックなどの「排他制御」を追加します。その後、逐次処理と比較して「処理能力における並列化の効果」を評価し、さらに並列化により発生するデッドロックや「機能分散における品質の保持」を検証します。

並列化検討プロセス 図2 並列化検討プロセス
       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.