この記事は、インテル® ソフトウェア・ネットワークに掲載されている「How would you define “Energy Efficient”?」(http://software.intel.com/en-us/blogs/2012/01/18/how-would-you-define-energy-efficient/) の日本語参考訳です。
現在取り組んでいるソフトウェア・プロジェクトが電力効率の良いものであることを保証するように上司から命じられた場合、あなたならどうしますか?
電力効率コミュニティーのサイト (http://software.intel.com/en-us/articles/energy-efficient-software/) には、この課題を達成するためのさまざまなアイデアがあります。しかし、どのようにしたら課題を達成したことを上司に証明できますか? あるいは、アプリケーションがすでに最適化されている場合、何を基準に電力効率が優れていると判断できますか?
シリアル・アプリケーションの場合、パフォーマンスの評価基準は単純です。実行時間が短いほど、パフォーマ ンスが優れているといえます。並列アプリケーションでも同様の評価基準があります。同じワークロードをシリアル・バージョンよりも短時間で実行できるか、または同じ時間内にシリアル・バージョンよりも多くのワークロードを実行できるかです。
電力効率の判断基準はやや漠然としています。この問題に取り組んでいるインテルのエンジニアに聞いてみたところ、3 つの候補があることが分かりました。
総電力消費量
これは、ただ単にアプリケーション実行時に消費された総電力量、または時間単位あたりの平均電力消費量 (アプリケーションの電力消費量は処理の内容に応じて変動するため) を指します。いうまでもなく、総電力消費量が少ないほうが、より電力効率に優れたアプリケーションです。ラップトップ、ウルトラブック、その他のモバイル デバイスでは、低消費電力のアプリケーションはバッテリーを長持ちさせます。
しかし、電力効率が良いと見なすには、どのくらい低消費電力でなければならないのでしょうか? 特定の計算において、達成可能な最小レベルの電力消費量というものはあるのでしょうか? チューニングにより電力効率を向上させる余地がないかどうか、どのように判断できるのでしょうか? 並列処理では、アムダールの法則とその他の理論モデルを使用して、アプリケーションで達成可能な並列化の上限を計算することができます。電力効率にも同様のモデルはあるのでしょうか?
1 ワットあたりの性能
これは、電力 1 ワットあたりの処理量を指します。最適化の結果、同じ電力消費量でより多くの処理を行うか、またはより少ない電力消費量で同じ処理を行うことができれば、アプリケーションの電力効率は向上したことになります。ほとんどのアプリケーションには、単純なパフォーマンスの評価基準があります。FLOPS、レンダ リングされたピクセル数、処理されたトランザクション数、1 秒あたりのフレーム数 (FPS) などはすべて、アプリケーションのパフォーマンスを評価する一般的な基準です。
チューニング時には、変更前と変更後の相対的測定が簡単で分かりやすいでしょう。例えば、最初は 1 ワットあたり 10 個の FAUXtoe 操作を行っていたアプリケーションが、1 ワットあたり 20 個の FAUXtoe 操作まで行えるようになれば、チューニングによる効果が得られたことになります。前述の評価基準には、最適化の目標として掲げられる絶対値 (理論値?) はあるのでしょうか? アプリケーションの作業単位に応じて、もちろんあります。それらの評価基準では、ハードウェアの構成 (バッテリー、電力供給、プロセッサー、チップセット、GPU など) を考慮する必要はあるでしょうか?
アプリケーションのアイドル時の動作
私がこれまでの経験で気付いたことは、プロセッサーはできるだけアイドル状態、つまり、C-ステートにしておくべきだということです。アプリケーションでは、この経験則を略して HUGI (Hurry Up and Get Idle: 急いでアイドル状態にする) と表すことができます。処理をできるだけ早く完了するために必要な措置をとり、アプリケーションをアイドル状態にします (そして、それをできるだけ電力効率の良い方法で行います)。つまり、アプリケーションがどの程度効率良くユーザーからの入力またはその他の割り込みを待 機できるかを評価します。
アイドル時にアプリケーションがいかに効率良く実行しているかを評価するのは簡単です。C-ステート (C3、C6) 状態の割合を測定するだけです。これは、実行時間の絶対的な割合、またはその他のアプリケーションが実行していない状態でシステムがアイドル状態 (つまり、OS が休止状態) だった時間に対して相対的に測定されます。この評価基準は、ユーザーがタイプしたり、クリックするよりも速く実行できるユーザー対話型のアプリケーションには適していますが、計算負荷の高い実行ではどうでしょうか? 私が作成した Akari アプリケーション を実行してみたところ、80 スレッドで 22.56 倍のスピードアップを達成し、C3 状態だった時間は 3% 未満でした。利用可能なスレッド/コアにスポーンされたすべての並列タスクのことを考慮すると、このアプリケーションは電力効率が良いと見なされるのでしょうか?
いかがでしたか?
この記事の冒頭の質問を読んだとき、皆さんはここで紹介した評価基準のどれかを思い浮かべましたか? 似たようなアイデアを思いついたり、あるいは全く異なるアイデアが浮かんだかもしれません。
パフォーマンスは、過去、現在、そして未来にわたって、常にソフトウェアのチューニングと最適化を促進します。電力消費を抑えるために、パフォーマンスを犠牲にすること (実行時間の増加) はあるのでしょうか? それは将来のブログのトピックになるかもしれませんね。現時点では、パフォーマンスの維持または向上は必須であると仮定した上で、アプリケーション実行時に効率良く電力を消費していることを示す必要があります。