電力効率の良いアプリケーション・ソフトウェアの設計

同カテゴリーの次の記事

インテル® System Studio を使用する理由

この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Designing Application Software for Energy-efficient Performance」の日本語参考訳です。


PC は使用時間の 75% がプロセッサーのアイドル状態になるように設計されていますが、ユーザーの入力やサーバーの応答などに待機する時間を含めると、実際には使用時間の 90% がアイドル状態になると推測されます。アイドル状態のプロセッサーはスリープ状態にすることができます。スリープ状態では、通常消費されるほとんどの電力を節約できます。少なくとも、クライアント側で、プロセッサーのスリープ状態において理論上の省電力化がすべて実現されれば、機能性や生産性を損なうことなく、エンドユーザーの電力消費を大幅に節約することができるでしょう。

しかし、現況は異なります。さまざまな理由により、ユーザーはクライアントシステムがスリープ状態にならないように意図的に設定することがあります。アプリケーションで CPU がスリープ状態に入らないようにすることも珍しくありません。アプリケーション開発者は前者については何もすることができません。しかし、ラップトップやタブレット向けに設計、コード化、導入するソリューションの電力効率が良いかどうかを確認するためにできることは多数あります。さらに、シンクライアントを対象とする場合、開発者はバックエンド・サーバーがシンクライアントの操作とパワー・エンベロープにどのように影響を与えるか知っておく必要があります。

電力効率の良いクライアント・デバイス・アプリケーションを作成する最良の経験則に従う

アプリケーション開発者側から見ると、電力効率の良いアプリケーションを作成するための重要な鍵は、スリープ状態の遷移を効率良く制御することです。この目標を達成するのに役立つ、一般的なルールを次に示します。

  • システムがスリープ状態になることを不要に防ぐ動作を回避して、モニターやディスクの電源を切ることが可能なアプリケーションを設計する。スリー プ状態から完全にアクティブな状態への移行には多少の電力が必要になるため、アイドル状態のプロセッサーを不要に復帰しないアルゴリズムを開発する。
  • プロセッサーをスリープ状態に移行させないよう設計されたコードで、排除可能なものは取り除く。
  • スリープ状態を重視し、不要な作業を制御できるアプリケーションの開発フレームワークを使用する。
  • ユーザーがスリープを無効にしないように、よりコンテキストを意識し、ユーザーが受動的に対話している (例えば、視聴している) 場合にシステムがスリープ状態にならないよう対策を講じる。
  • タイマーとループの制御に消費電力を考慮した手法を導入する。決定論的ループをアンロールするコンパイラー・オプションの使用を検討し、実行される命令の全体の数が減るように (例えば、ポーリングを削除して) 調整する。
  • 消費電力を考慮したツールを使用してアプリケーションのプロセッサーの利用パターンを特定する。

図 1 に示されているように、優れた設計のアプリケーションは、起動中もアイドル状態のときは全体の消費電力にほとんど影響しません。

図 1. 重要な電力管理の基本: アイドル状態のアプリケーションは消費電力に影響しない。

アプリケーションの電力効率を評価して最適化するツールとテクニック

通常のパフォーマンス最適化とは異なり、開発者はアプリケーションの電力効率が低いことを実際に見たり推測することはできません。クライアント側のアプリケーションの電力効率を実際に向上させるには、電力効率を最適化するツールやテクニックを使用する必要があります。

図 2 は、15 種類のアプリケーションを測定した結果です。このグラフは、アプリケーションの平均消費電力 (ワット) と、ベースラインに対する電力消費の割合 (パーセント) を示しています。例えば、Instant Messenger-4 をアイドル状態で実行すると、システムの消費電力は 1.7 ワット増加し、システムがアイドル状態の (アプリケーションを実行しない) 場合よりも消費電力は 21 パーセント増えます。このアイドル状態の電力消費は、バッテリー約 4 時間分の影響を与えます。この調査から、同じカテゴリーのアプリケーションでもアイドル状態における電力消費の傾向は異なることが分かります。

図 2. アプリケーションの電力効率の「自然な」動作を分析することは複雑です。

クライアント側のアプリケーションを、消費電力を考慮したものにするのは難しいわけではありませんが、注意して行う必要があります。アプリケーション開発者にとっては、これは、優れた設計を実証し、改良が必要なプログラムロジックの欠点を発見する、フレームワークとインストルメンテーションの選択および使用にかかわる問題です。

インテル® エネルギーチェッカー

インテル® エネルギーチェッカー SDK を使用すると、開発者はアプリケーションがどのように電力を消費しているかを分析することができます。総消費電力はすべてを表しているわけではないため、この情報が最適化の鍵となります。実際の効率を把握するには、アプリケーションの電力消費と処理の関係を正しく理解する必要があります。例えば、電力の低下は、統合が不十分なレガシーコード、ライブラリーとコンポーネントにおける効果の重複、処理アクティビティーの浪費、その他の結果であるかもしれません。

電力を浪費するアプリケーションの動作を特定することは、メモリーリークなどのアプリケーションにとって致命的な欠陥を特定することに匹敵します。これらの動作は非常に繊細なため、インストルメントされたコードと、文書化されたシナリオ、そしてテスト環境なしに問題を分析することは不可能です。幸いなことに、インテル® エネルギーチェッカーは、このテスト環境を提供しています。この SDK により、開発者は次のことを行えます。

  • アプリケーションの生産性と電力消費を評価する。
  • 実行された操作、タイミング、付帯条件に関する特定の測定基準を報告するようにコードをインストルメントする。
  • さまざまな実行方法により、大規模なパフォーマンスのデータセットを生成する。
  • 代替ライブラリー、ドライバー、フレームワークが電力消費に与える影響を評価する。
  • 最適化と改善を行う
  • 顧客やサードパーティのテスターが電力効率の良いアプリケーションとして証明できる方法でアプリケーションをインストルメントする。

インテル® エネルギーチェッカーがクライアント・アプリケーション開発者にもたらすもの

インテル® エネルギーチェッカー SDK は、完全なテストおよび検証環境です。基礎となる階層には、アプリケーションの生産性を直接測定できるカウンター API が含まれます。カウンターのエクスポートとインポートにより、アプリケーションが互いに、あるいはシステム全体でどのように効率良く動作しているかを分析するメカニズムが提供されます。

インテル® エネルギーチェッカーのコンパニオン・ビルドとスクリプトツールは、ソースが利用できない、またはインライン・インストルメンテーションで実際に構築できないコードを分析する手段を提供します。コマンドライン・ユーティリティーを使用すると、インテル® エネルギーチェッカーのツールとデータストリームをネイティブの Windows*/Linux* カウンターやユーティリティーと相互に利用することができます。Oracle* Solaris 10、Mac OS X*、および Linux* MeeGo ベースのアプリケーションをインテル® エネルギーチェッカーのテストと検証機能で評価することもできます。

インテル® エネルギーチェッカーのツールセットが提供する最も大きな利点の 1 つは、さまざまなアプリケーション開発環境のサポートです。開発者がすぐにプロジェクトに取り組むことができるように、SDK には、以下の状況における使用法を示すサンプルアプレットが用意されています。

  • スレッド利用
  • Java* からの呼び出し
  • C# からの呼び出し
  • Objective-C からの呼び出し
  • Linux* システム情報ユーティリティー利用
  • CPU 使用ヒストグラム・ジェネレーター・ツール
  • クラスターの電力効率
  • PL サンプリング測定

スイートは、C、C++、C#、Objective-C、Java*、PHP、Perl を含む、現在主に使用されている一般的なアプリケーション・プログラミング言語の多くをサポートしています。

Microsoft* Joulemeter を使用して電力効率を分析する

Microsoft* Research の Joulemeter は、システム・アーキテクト、管理者、開発者がコンピューティング・インフラストラクチャーの電力効率を向上させるモデリングおよび最適化ツールを作成できることを目的に提供されています。Joulemeter Research Program の重要なポイントは、あらゆる種類と規模の計算インフラストラクチャーで消費される電力をモデリングし最適化することにあります。省電力を実際に達成するにはシステム全体を最適化する必要があるため、この情報は非常に重要です。軽量のモバイル・クライアントであっても、操作が全体に与える電力効率の影響など、バックエンド・サーバーにおける動作が及ぼす影響を考慮する必要があります。

Joulemeter Research Project は、Windows* 7 を実行するラップトップとデスクトップ向けに、軽量でスタンドアロンの Joulemeter アプリケーションを提供しています。アプリケーションは、リソースの使用状況 (CPU 使用率、画面のバックライトの状況、アンテナの電力状況、その他) を追跡して、1 台のコンピューターの消費電力を推定します。Joulemeter は、これらの測定からシステムの消費電力を予測します。

インテル® Battery Life Analyzer

インテル® Battery Life Analyzer (BLA) は、Windows* オペレーティング・システムを実行するコンピューターのバッテリー状況をモニターする軽量のツールです。バッテリー駆動型システムの電力に関連するアプリケーションのパフォーマンスを経験に基づいて評価することで、アプリケーション・コードのわずかな変更により大幅にパフォーマンスを向上できることがあります。BLA を使用すると、開発者は「アプリケーションのアイドル」状態がプラットフォームのアイドル状態に収束する可能性を見つけられます。

特に BLA は、ほとんどの電力管理とアカウンティング API が直面する問題を解決できます。本質的に、アカウンティング API は、タイマーのティック間隔 (15.6 ミリ秒) でサンプリングされたデータで動作します。このため、ソフトウェアの操作がタイマーのティックで開始して次のティックの前に終了すると、フルティックの粒度を使用する測定基準では検出することができません。

これは無視できる問題のように思えますが、実際には無視できません。多くの同時性操作 (メディアの制御など) はこのカテゴリーに分類されます。これらの操作により、プラットフォーム全体の作業の各部分は大きくなります。対照的に、BLA は、マイクロ秒単位の時間記録に基づく細粒度のプロセス情報を使用します。BLA は、指定されたアクティビティーの開始と終了を記録します。その結果、電力使用率をより正確に分析するだけでなく、はるかに完全な情報が提供されます。 (このトピックの詳細は、「関連情報」セクションのインテルのホワイトペーパー: 『Energy Efficient Platforms—Considerations for Application Software and Services』のリンクを参照してください。)

モバイルデバイスのバッテリー寿命に関する考察

バッテリーは、コンピューティング・プラットフォームの動力源としてますます重要になっています。2011 年の初めに販売されたスマートフォンの台数は PC の約 4 倍でした。今後は、モバイル・アプリケーションの電力効率があらゆる種類のソフトウェアの利用者にとって大きな懸念事項となることが予想されます。バッテリー駆動型のデバイスは、バッテリーで駆動される状況が常に想定されるため、モバイルデバイスの開発者は電力効率に関して一般にかなりの知識があります。

すべてのモバイル開発プラットフォームには、電力状態 (コンセントに接続されているか、バッテリーで動作しているか) の検出、バッテリーレベルのテスト、電力環境に応じてシステムとアプリケーションの動作をスケーリングする手法が含まれています。Apple*、Symbian*、Microsoft*、RIM*、その他のモバイルデバイスを提供しているベンダーは、この数年間、アプリケーション開発者が小さなデバイスで優れた電力管理を行えるように支援する一般的なガイドラインの確立に尽力してきました。これらのルールの多くは、電力効率の向上を目的とするラップトップおよびデスクトップ・アプリケーションにも適用できます。

  • タイマーベースの設計をイベント駆動型または割り込み駆動型のロジックに変更する。
  • 高解像度の時間ソースとしてタイマーを使用しない。ほかの選択肢がない場合、タイマー解像度が特定のタスクに関係していなければ、システムのデフォルト設定にリセットされるようにする。
  • コンテンツを受動的に表示するように設計されたアプリケーションは、電力リクエストや可用性 API を使用した再生に対応するため、表示を暗くするタイムアウト時間を明示的に長くする必要がある。アプリケーションが最小化または非アクティブ化された場合、リクエストを明示的に無効にする。
  • スクリーンセーバーなどは、バックライトを暗くするタイムアウト時間を変更すべきではない。外観上の理由がない限り、スクリーンセーバーは LCD を保護するために動作しており、電力を浪費しているにすぎません。電力効率を優先するのであれば、バックライトを暗くしましょう。画面を黒くすることとバックライトを暗くすることは異なります。

不適切なスリープ状態の管理は、アプリケーションの電力消費を大幅に増加させます。効率良く並列処理を使用する、単一スレッドで並列化が困難なタスクを融合する、スレッド間の同期の過度な要求を回避する、などはすべて、アプリケーションがトリガーするスリープ状態への遷移の数を減らす手法です (図 3 を参照)。

図 3. スリープ状態の効果的な管理はアプリケーションの電力効率を高める鍵です。

まとめ

経済および環境への配慮がソフトウェア工学の最良の経験則についての考えを形作ったように、アプリケーション・ソフトウェアの電力効率を管理することが、近い将来に開発者のコア・コンピタンス (核となる能力) となることは十分に想定されます。この目的のために、多くの優れたツールが存在します。インテル® エネルギーチェッカー SDK は、デスクトップとモバイルの両方のプラットフォームを対象とするクライアント・ソフトウェア開発者に、電力効率を最適化する機能を提供し、その作業を支援します。

電力管理ツールとリソースに関するリンクと関連情報

著者紹介

Nancy Nicolaisen: モバイルおよび組込みデバイス・テクノロジーを専門とする研究者であり、ベテランのソフトウェア開発者です。彼女の特集記事、コラム、分析は、BYTE、PC Magazine、Windows Sources、Computer Shopper、Dr. Dobbs Journal of Software Engineering、Microsoft Systems Journal などの出版物に掲載されています。これまで、『Making Windows Portable: Porting Win32 to Win CE (2002, John Wiley & Sons)』、『The Practical Guide to Debugging 32 Bit Windows Applications (1996, McGraw Hill)』、『The Visual Guide to Visual C++ (1994, Ventana Press) (5 言語で出版)』の 3 冊を執筆しています。2007 年には、Microsoft の Professional Education コース、「Designing, Building and Managing Wireless Networks.」のテクニカル・アドバイザーに就任しました。現在は、モバイル、組込み、ワイヤレスデバイスのオープンソース・テクノロジーおよびトレンドの調査にあたっています。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事