新人技術者のためのロジカル・シンキング入門(8) ―― CPUの演算量をひたすら削る
【2】演算速度を向上するには
CPUの演算量がボトルネックとなるケースの最適化方針を,図4に示します.演算処理が重いわけですから,ポイントとなるのは,「仕様を満たす機能の実装をいかにして効率の良い命令に置き換えるのか」です.そのため,最適化の工程においては,C言語のような高級言語で実装されたモジュールをアセンブリ言語などの低級言語に置き換えて実装することが求められるようになります.
図4 処理速度向上のためのアプローチ
すべての最適化がアセンブリ記述で解決するものではない.メモリの使い方を工夫しなければならないこともある.アセンブリ記述による最適化は,コンパイル結果の流用から始めてハンド・アセンブルに移るとスムーズ.
組み込みシステムにおけるコンパイラの生成効率は近年飛躍的に向上しています.とはいえ,CPUのアーキテクチャによっては,コンパイラの生成効率に限界があることがあります.そのため,プログラマがコンパイラに代わって最適なアセンブリ・コードを書く必要が生じることがあります.
● まずはコンパイル結果の流用から
さて,「効率的なアセンブリ・コードを書く」といっても,初心者の場合には,アセンブリ言語で一からコーディングするのはなかなか難しいと思います.アセンブリ言語は,C言語のような高級言語とはコーディングのやり方がかなり異なります.ましてや,最近の組み込み開発で用いられるCPUは,一昔前のものと異なり,アーキテクチャが複雑です.従って,命令体系を理解して使いこなすには,なかなか敷居が高い面もあるでしょう.
そこで,初心者が最適化実装をこなすに当たっては,まずはコンパイル結果の改造から着手することをお勧めします.まず,コンパイラにアセンブル結果を生成させて,それを流用することから始めるのです.そして慣れてきたら,今度は一からアセンブリ言語でコーディングすることにします.すなわち,
- C言語などでコーディング
- コンパイル結果のアセンブリ・コードを改造
- アセンブリ言語で一からコーディング
という順番で最適化を進めていきます(図5).これは技術を順に習得していく上からも,開発効率の上からも望ましいと思います.もちろん,1)の段階で,仕様を満たすように実装する必要があるのは言うまでもありません.
図5 アセンブリ言語によるコーディング
コンパイラが生成するアセンブリ・コードの改造から始める.コンパイル結果の流用では効率の良いコードが書けないモジュールもあるので,一からアセンブリ言語で書く必要も生じる.開発効率や技術の習熟度を考えて工夫するとよい.
初心者から見ると,CPUの命令解説書の記述から最適なコーディングへとつなげていくのは,なかなか難しいものがあると思われます.そんなときはまず,コンパイル結果のアセンブリ言語を眺めて,その無駄な記述を見破れるようになることで,最適化実装への第1歩とすることができます.