
拓海先生、最近部下から「コンパイラの最適化で性能が変わる」と聞いて戸惑っています。要はソフトを直さなくても速くなるという話ですか?

素晴らしい着眼点ですね!大丈夫、簡単に説明しますよ。結論から言うと、ソースコードを変えずにコンパイラの「最適化のやり方」を少し変えるだけで、実行時間とエネルギー消費が改善できるんですよ。

これまでは「最適化レベル」って-O2とか-O3といった決まり文句だと聞いています。その設定をいじるだけで本当に効果が出るのですか?投資対効果が気になります。

良い質問です。要点を3つにまとめます。1) 標準の最適化レベルには複数の処理(パス)が順序付けられている。2) その順序は有用だが、最後まで全部実行する必要はない場合がある。3) 最後を切るだけで性能や消費電力が改善するケースがあるのです。

なるほど。具体的にはどのような対象で試したのですか?我が社の組込み機器にも使えるのでしょうか。

対象は組込み向けのプロセッサ、具体的にはARM Cortex-M0とCortex-M3で、LLVMというコンパイラフレームワークを使って検証しました。組込み機器は電力やリアルタイム性が重要なので、まさに御社のような現場に向いていますよ。

これって要するに、標準の-O2とかを途中で止めることで性能が向くということ?最適化を減らすんですか、それとも選び直すのですか。

素晴らしい要約です。ポイントは「減らす」ではなく「部分列を使う」ことです。標準レベルが定義する最適化パスの順序をそのまま利用し、途中で終わらせる。つまり順序は維持しつつ、最終段を省くことで局所的に良い結果が出るのです。

費用の面で言うと、学習に時間をかける手法や機械学習を使う方法も聞きますが、それと比べて現場導入は簡単ですか。

大丈夫です。複雑な機械学習や大規模な反復探索(iterative compilation)に比べて、この手法は試行数が少なく済み、移植性も高い。つまり、初期コストが低くて実装が現実的です。現場の負担が小さいのは重要な利点です。

そうか。では実際にどれだけ効果が出るのか。数字で示してもらえますか。投資対効果を説明する材料が欲しいのです。

実験では71のベンチマークで評価し、片方のプロセッサで平均2.4%の実行時間短縮、もう片方で平均5.3%の短縮が確認されました。半分以上のベンチマークで改善が見られ、エネルギー消費にも同様の改善が報告されています。

小さな数値に見えますが、量産機での累積効果を考えれば馬鹿にできませんね。導入の手順はどんな感じですか。

流れはシンプルです。まず標準最適化レベルのパス順列を取得し、順序を維持したまま途中で止めた複数の構成を生成する。次に少数(例えば64未満)の候補に対してビルドと測定を行い、最も良い構成を選ぶだけです。運用負荷は限定的です。

わかりました。最後に私の理解を整理させてください。要するに「コンパイラの既存の最適化手順を途中で止めるだけで、現場でも使える性能と省エネの改善が得られる」ということで間違いありませんか。これなら現場説明がしやすいです。


