HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。 |
[記事一覧を見る]
Moblinアプリケーションはクロスコンパイル環境での開発が推奨されており、通常のLinux向けアプリケーションとは若干開発手順が異なる。本記事ではIDEを使った基本的な開発手順や、インテル コンパイラーを利用してMoblinアプリケーションをコンパイルするための設定方法を解説する。また、インテル コンパイラーとGCCの性能比較結果についても紹介する。
前回述べたとおり、Moblinは比較的リソースの少ない環境に向けたOSであるため、Moblinアプリケーションを開発する場合はMoblin SDKや各種開発環境を導入したLinuxマシン上でコーディングやコンパイルを行い、テスト・デバッグは実機もしくは仮想環境上にインストールしたMoblin環境にバイナリを転送して行う、という行程が推奨されている。MoblinではEclipseやAnjutaなどのIDE向けにプラグインが用意されており、これらを利用することでこれらの作業を自動化することが可能だ。本記事ではまずEclipseを利用する場合の手順を説明し、続いてAnjutaを利用する手順を説明する。また、テキストエディタでソースを編集し、コマンドラインでコンパイル等を行うという古典的な開発スタイルについても利用可能なので、こちらについても簡単ではあるが述べておこう。
なお、下記ではMoblinアプリケーションの開発環境がすでに構築されていることを前提に解説を行っていく。開発環境の構築については前回の記事で詳細に説明しているので、そちらを参照していただきたい。
まず、Eclipseを利用したMoblinアプリケーションの開発手順について解説していこう。
Eclipseでは、「プロジェクト」と呼ばれる単位でファイルや各種依存関係、そのほかアプリケーションの作成に必要な情報を管理する。Moblinアプリケーションを開発する場合、Cの開発プロジェクトとしてプロジェクトを作成する。まずEclipseを起動し、「File」メニューの「New」−「Project」を選択する。「New Project」ウィンドウが表示されるので、ここで「C Project」を選択し、ウィザードを進めて行く。
ウィザードではプロジェクト名や「Project Type」などを設定する(図1)。「Project type」では「Moblin Autotools Project」内の「Clutter Hello World Project」を選択する。
続いて「Next」をクリックすると、作者名やコピーライト、ソースコード格納ディレクトリ、ライセンスなどを入力する画面(Basic Settings画面)が表示されるので、それぞれ適切なものを入力して「Next」をクリックする。それぞれの意味は次の表1のとおりだ。
項目名 | 意味 |
---|---|
Author | アプリケーションの作者名 |
Copyright notice | アプリケーションのコピーライト表記 |
Source | ソースコードを格納するディレクトリ |
License | アプリケーションの配布ライセンス |
最後に各種設定を行う「Select Configurations」画面が表示されるが、ここでは特に設定するべき項目はないので、そのまま「Finish」をクリックしよう。以上でソースコードおよび「ChangeLog」や「AUTHORS」、「COPYING」といった各種ドキュメント、各種設定ファイル等のひな形が生成される。 これらのファイルに独自の修正を加えて行き、アプリケーションを作成して行くわけだ。
以上のようにプロジェクトを作成すると、プロジェクトの作成後に自動的にコンパイル作業が行われ、作成したプロジェクトディレクトリ内のソースコードディレクトリ(デフォルトでは「src」ディレクトリ)にバイナリが生成される。ただし、ここで作成されたバイナリはMoblin環境向けのバイナリであるため、開発用環境では直接実行できない。そのためコンパイル後のテストやデバッグは、このバイナリを別途用意したMoblin環境にネットワーク経由で転送して行うことになる。
バイナリをMoblin環境に転送して実行可能にする(デプロイする)には、まずEclipseのメニューバーの「Project」−「Invloke Moblin Tools」−「Deploy」を選択する。
すると、デプロイ先を選択するウィンドウが表示される。デフォルトではデプロイ先としてローカルマシンのみが表示されているが、ここではネットワーク経由でデプロイを行うので、まずは「New」をクリックし、デプロイの設定を行う。「New Connection」ウィンドウが表示されるので、「System type」として「SSH Only」を選択し、ウィザードを進めて行こう(図2)。
設定が完了するとデプロイ先の選択ウィンドウに戻るので、「Connection」で先ほど入力したデプロイ先を選択し、続いてリスト内の「Root」をダブルクリックする。すると「Enter Password」ダイアログが表示されるので、「User ID」に「root」、「Password」にrootのパスワードを入力して「OK」をクリックする。初回接続時は接続先の指紋情報を確認するメッセージボックスが表示されるので、「Yes」をクリックして続行する。するとデプロイ先となるディレクトリを選択できるようになるので、実行ファイル等を転送するディレクトリ(通常は「/」)を選択し、「OK」をクリックする(図3)。
これで、Moblin環境の指定したディレクトリ(通常は/usr/local/bin)以下に作成したアプリケーションがデプロイされる。たとえば作成したプログラム名が「helloworld」なら、Moblin環境のターミナルで下記を実行することで、プログラムを実行できるはずだ。
$ /usr/local/bin/helloworld
なお、以上の手順でデプロイしたプログラムは、「Project」メニューで「Invloke Moblin Tools」−「Undeploy」を選択し同様の手順を踏むことで削除できる(アンデプロイ)。
Anjutaを利用したMoblinアプリケーションの開発手順についても、基本的にはEclipseの場合と同じである。ただし、プロジェクトファイルの作成やRPMパッケージの作成にはそれぞれ「Linux Project Generator」および「Moblin Package Creator」という外部ツールを利用する点が異なる。
まず、「アプリケーション」メニューから「Linux Project Generator」を選択する、もしくはターミナルで下記のように実行してLinux Project Generatorを起動する。
$ projgen
Linux Project Generatorでは、プロジェクトの名前や保存先、説明、作者、作成するプロジェクトの種別、ライセンスなどといった情報を入力していく(図4)。入力する情報は次の表2のとおりだ。
タブ | 項目名 | 入力する内容 |
---|---|---|
Main | Title | プロジェクト名 |
Short name | プログラム名 | |
Path | プロジェクトの保存先 | |
Description | プロジェクトの解説 | |
Author | 作者名 | |
Copyright | 著作権者名 | |
Structure | - | 作成するプロジェクトの種別 |
Code | Framework | 作成するアプリケーションで使用するフレームワーク |
Build | Build Flags | デフォルトのコンパイルオプション |
License | License | 作成するアプリケーションのライセンス |
なお、今回はMoblinの標準GUIであるClutterを使用する標準的なアプリケーションを作成するので「Structure」タブでは「Single Application」、「Code」タブの「Framework」では「Basic Clutter Application」を指定している。
「Build」タブでは、コンパイルオプションや依存するライブラリ等を指定するが、通常は特に変更する必要はない。最後に「License」タブでプログラムのライセンスを選択し、「Create」ボタンをクリックしてプロジェクトを作成する。作成に成功すると「Project Created」というメッセージボックスが表示されるので、「閉じる」をクリックしてウィンドウを閉じ、Linux Project Generatorを終了しよう。
以上が完了すると、Eclipseでプロジェクトを作成した場合と同じく「ChangeLog」や「AUTHORS」、「COPYING」といった各種ドキュメント、各種設定ファイル等のひな形が作成される。
続いて作成したプロジェクトをAnjutaで開き、コンパイルを実行する。まず、アプリケーションメニューから「プログラム」−「Anjuta IDE」を選択する、もしくはターミナルで下記のように実行してAnjutaを起動する。
$ anjuta
次に、「ファイル」メニューの「新規」−「既存のソースからのインポート」を選択し、「Import project」ウィンドウを開く(図5)。「Import options」で「Import from folder」を選択し、先ほどLinux Project Generatorで作成したプロジェクトを含むディレクトリを選択して「Import」をクリックする。
また、ここでMoblin SDKの設定も行っておこう。「編集」メニューの「設定」を選択して「Anjutaの設定」ウィンドウを表示し、左ペインで「Moblin SDK」を選択すると設定項目が表示される。ここで設定する項目は次の4つだ(図6)。
以上を設定したら「閉じる」をクリックしてウィンドウを閉じ、ツールバーの「プロジェクトのビルド」をクリックしてビルドを実行してみよう。初回ビルド時は「プロジェクトの構成」ダイアログが表示されるので、そのまま「実行」をクリックする。
コンパイルが成功したら、作成されたバイナリをMoblin環境に転送(デプロイ)して実行してみよう。メニューバーの「Tools」−「Deploy」を選択し、表示されるメッセージボックスにMoblin環境のrootパスワードを入力して「OK」をクリックする。これで作成したバイナリがMoblin環境に転送され、実行できるようになる。たとえばShort name(プログラム名)が「hellomoblin」の場合、Moblin環境でターミナルを起動して下記にように実行すれば、作成したプログラムが実行されるはずだ。
$ hellomoblin
なお、Anjuta用のMoblin SDKプラグインではデプロイしたファイルを削除する機能が備えられていない。そのため、転送したファイルの削除は手動で行う必要がある。
EclipseやAnjutaでは、autoconfを利用してコンパイルの際の環境設定を行っている。そのため、インテル Atom プロセッサー向け インテル アプリケーション・ソフトウェア開発ツール・スイートに含まれるインテル コンパイラーでコンパイルを行う場合、コンパイル前に行われるconfigureスクリプトの実行時に特定の環境変数が設定されている必要がある(表3)。
環境変数 | 与える値 | 説明 |
---|---|---|
CC | icc | 使用するコンパイラを指定する |
AR | xiar | 使用するアーカイバを指定する |
LD | xild | 使用するリンカーを指定する |
CFLAGS | -I$PKG_CONFIG_SYSROOT_DIR/usr/include -I$$PKG_CONFIG_SYSROOT_DIR/include | コンパイル時のオプションを指定する |
LDFLAGS | -L$PKG_CONFIG_SYSROOT_DIR/usr/lib -L$PKG_CONFIG_SYSROOT_DIR/lib | リンク時のオプションを指定する |
ここでは、コンパイラやアーカイバ、リンカーを指定するとともに、コンパイラやリンカーに渡すオプションについても設定している(ヘッダーファイルおよびライブラリの検索パスにMoblin SDKのディレクトリを追加している)。そのほか、最適化オプション(たとえば「-O3」など)を指定する場合はCFLAGS環境変数に追加すればよい。
なお、インテル コンパイラーを利用する場合はEclipseもしくはAnjutaの起動時にインテル コンパイラーへのパスが通っている必要がある。インテル コンパイラーには環境変数を設定するためのスクリプトが用意されているので、ターミナルでこのスクリプトを実行してからEclipseもしくはAnjutaを起動すれば良い。たとえばEclipseの場合、次のようにする。
$ . /opt/intel/atom/Compiler/11.1/056/bin/iccvars.sh $ eclipse
Anjutaを利用する場合も同様だ。
$ . /opt/intel/atom/Compiler/11.1/056/bin/iccvars.sh $ anjuta
それでは、まずEclipseでの設定手順を解説しよう。Eclipseの「Project」メニューで「Properties」を選択すると、プロジェクトのプロパティ設定ウィンドウが開く。ここで左ペイン内の「C/C++ Build」−「Envronment」を選択すると、環境変数の設定画面が表示されるはずだ(図7)。ここで、次の表4のように環境変数を追加する。
環境変数名 | 値 |
---|---|
CFLAGS | -I$$PKG_CONFIG_SYSROOT_DIR/usr/include -I$$PKG_CONFIG_SYSROOT_DIR/include |
LDFLAGS | -L$$PKG_CONFIG_SYSROOT_DIR/usr/lib -L$$PKG_CONFIG_SYSROOT_DIR/lib |
また、コンパイル時にコンパイラに渡したい引数もこれらの環境変数で設定できる。たとえば、コンパイル時に最大限の最適化を実行する場合、次のようにして「-O3」オプションをCFLAGS環境変数に追加すればよい。
-O3 -I$$PKG_CONFIG_SYSROOT_DIR/usr/include -I$$PKG_CONFIG_SYSROOT_DIR/include
続いて、同じくプロパティ設定ウィンドウ内にある「Autotools」−「Configure Settings」を選択する。ここではconfigureスクリプトの実行時に与える引数を設定できる。右ペインで「configure」−「Advanced」を選択し、「Additional command-line options」に「CC=icc LD=xild AR=xiar」と入力する(図8)。
以上の設定を行ってメニューバーの「Project」−「Clean」を実行するとMakefileの再生成が行われ、インテル コンパイラーを用いてアプリケーションのビルドが行われるはずだ。
いっぽうAnjutaを利用する場合は、まず「ビルド」メニューの「プロジェクトの構成」を選択する。「プロジェクトの構成」ウィンドウが表示されるので、「構成方法の種類」に適切な名称を入力し、続いて「Configureのオプション」に次のように入力して「実行」をクリックする(図9)。
CC=icc AR=xiar LD=xild 'CFLAGS=-I$PKG_CONFIG_SYSROOT_DIR/usr/include -I$PKG_CONFIG_SYSROOT_DIR/include' LDFLAGS=-L$PKG_CONFIG_SYSROOT_DIR/usr/lib -L$PKG_CONFIG_SYSROOT_DIR/lib'
すると、指定したオプション付きでconfigureが実行され、Makefileが生成されるはずだ。もしconfigureの実行に失敗した場合、「構成方法の種類」で「デフォルト」を選択し、「プロジェクトを再生成する」にチェックを入れて実行した後に再度試してほしい。
続いて「ビルド」メニューの「構成の選択」で先ほど選択した構成を選択し、「プロジェクトのビルド」を実行すると、インテル コンパイラーを使用してコンパイルが行われる。
EclipseやAnjutaのMoblin SDKプラグインは非常に便利であるが、既存のアプリケーションをMoblin向けにコンパイルする場合など、コマンドラインでのコンパイルが必要なケースもある。また、テキストエディタ+コマンドラインによる開発のほうが親しみやすい開発者もいるだろう。そこで、最後にIDEを利用せず、コマンドラインベースでMoblinアプリケーションのコンパイルを行う方法を説明しておこう。
開発用のLinux環境でMoblinアプリケーションをコンパイルするには、Moblin SDKに含まれるクロスコンパイラやヘッダーファイル、ライブラリを利用する。まず、これらを利用できるように環境変数を設定する。
$ export PKG_CONFIG_SYSROOT_DIR=$MOBLIN_TOOLCHAIN/i586-moblin-linux/sys-root $ export PKG_CONFIG_PATH=$PKG_CONFIG_SYSROOT_DIR/usr/lib/pkgconfig:$PKG_CONFIG_SYSROOT_DIR/usr/share/pkgconfig $ export PATH=$MOBLIN_TOOLCHAIN/bin:$PATH
上記の設定は適当なシェルスクリプトとして保存しておき、利用の際に適宜ロードするようにしておくとよいだろう。
以上の環境変数が設定された状態で、コンパイルしたいアプリケーションのconfigureスクリプトを次のような引数付きで実行する。
$ ./configure --host=i586-moblin-linux --prefix=/tmp/<適当な一時ディレクトリ>
今回はコンパイルを実行したマシンとは異なるマシンにファイルをインストールしたいので、インストール先を指定する「--prefix」オプションで適当な一時ディレクトリを指定しておく。
また、インテル コンパイラーを利用したい場合やコンパイルオプションを変更したい場合もこのときに指定を行う。たとえばより強力な最適化を行う「-O3」オプション付きでインテル コンパイラーを利用する場合は次のようにする。
$ ./configure --host=i586-moblin-linux --prefix=/tmp/<適当な一時ディレクトリ> CC=icc AR=xiar LD=xild 'CFLAGS=-I$$PKG_CONFIG_SYSROOT_DIR/usr/include -I$$PKG_CONFIG_SYSROOT_DIR/include -O3' 'LDFLAGS=-L$$PKG_CONFIG_SYSROOT_DIR/usr/lib -L$$PKG_CONFIG_SYSROOT_DIR/lib'
次に、通常通りmakeコマンドを実行してコンパイルを行う。
$ make
コンパイルが完了したら、「make install」コマンドを実行し、指定した一時ディレクトリ以下にファイルをインストールする。
$ make install
あとは、scpやrsync等を利用し、一時ディレクトリ以下にインストールされたファイルをMoblin環境にコピーすればよい。
なお、コンパイルにconfigureを利用しないアプリケーションの場合は、上記の環境変数を設定した上でコンパイラや関連ツールとして「$MOBLIN_TOOLCHAIN/bin」以下にある「i586-moblin-linux-gcc」や「i586-moblin-linux-ld」、「i586-moblin-linux-ar」などを利用するよう手動で設定する必要がある。
作成したMoblinアプリケーションは通常、RPM形式のパッケージとして配布することになる。Moblinでは「Moblin Package Creator」と呼ばれるパッケージ作成ツールが用意されており、これを利用することで簡単にRPMパッケージの作成が可能だ(図10)。Moblin Package CreatorはEclipseの「Project」メニュー内「Invoke Moblin Tools」−「Create RPM/DEB」から起動できる。また、Anjutaを使っている場合はアプリケーションメニューから「プログラム」−「Moblin Package Creator」を選択する、もしくはターミナルで下記のように実行して起動できる。
$ moblin-package-creator
Moblin Package Creatorの「Main」タブでは、パッケージ名や依存パッケージ、バージョン、説明などを入力する。それぞれの意味は次の表5のとおりだ。
項目名 | 意味 |
---|---|
Name | パッケージ名 |
Requires(RPM) | 依存するRPMパッケージ |
BuildRequires(RPM) | ソースコードからバイナリをビルドする際に必要となるRPMパッケージ |
Depends(DEB) | 依存するdebパッケージ。debパッケージを作成する際に入力する |
BuildDepends | ソースコードからバイナリをビルドする際に必要となるdebパッケージ。debパッケージを作成する際に入力する |
Project root path | ソースコードや各種設定ファイルなど、プロジェクトに含まれるファイルが含まれるディレクトリのパス |
Version | パッケージのバージョン |
Description | パッケージの説明 |
Package Group | パッケージの分類 |
Configure Parameters | パッケージ作成の際にconfigureプログラムに渡す引数 |
これらを入力したら、続いて「Build Control」タブの「Output」項目で作成するパッケージや保存先を設定する。Moblin Package CreatorではRPMパッケージだけでなくdebパッケージや各種ソースパッケージも作成できるが、基本的にはRPMパッケージのみを作成すればよい。また、「License Details」タブではライセンスや作成者の名前といった情報を入力できる。
以上の設定の完了後、「Create」をクリックするとパッケージの作成が行われ、指定したディレクトリにパッケージが保存される。
作成したパッケージは、Moblin環境にコピーした後に次のようにしてインストールできる。
$ sudo rpm -i <パッケージ名>
インストールされたパッケージはMoblinの「アプリケーション」タブに登録され、ほかのアプリケーションと同様、ここから起動できる(図11)。
さて、インテル Atom プロセッサー向け インテル アプリケーション・ソフトウェア開発ツール・スイートに含まれるインテル コンパイラーは「GCCよりも大幅に優れたパフォーマンスを提供します」とうたわれている。そこで、最後にGCCとインテル コンパイラーのパフォーマンス差について簡単ではあるがベンチマークを行った結果を紹介しよう。
Linux環境ではさまざまなベンチマークツールがあるが、これらの多くはCPUの単純な演算性能やI/O性能、グラフィック性能を測るものであり、コンパイラの性能比較には利用しにくい。そこで、ここではファイル圧縮/展開ツールであるbzip2をGCCおよびインテル コンパイラーでコンパイルし、ファイルの圧縮/展開速度を比較した。使用したbzip2のバージョンは1.0.5だ。なお、bzip2のソースコードはbzip2のWebサイトからダウンロードできる。
bzip2のコンパイル設定はconfigureスクリプトではなく、付属のMakefileを直接編集して行う。まず、ダウンロードしたソースコードを適当なディレクトリに展開する。
$ tar xvzf bzip2-1.0.5.tar.gz
Makefile冒頭でコンパイラや関連ツール、コンパイルオプションを設定するための変数が用意されているので、こちらを書き換える(リスト1)。
# To assist in cross-compiling CC=gcc AR=ar RANLIB=ranlib LDFLAGS= BIGFILES=-D_FILE_OFFSET_BITS=64 CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) # Where you want it installed when you do 'make install' PREFIX=/usr/local
設定する変数は、次の表6のとおりだ。
変数名 | 意味 | GCCを利用する場合の設定 | インテル コンパイラーを利用する場合の設定 |
---|---|---|---|
CC | 使用するコンパイラ | i586-moblin-linux-gcc | icc |
AR | 使用するアーカイバ | i586-moblin-linux-ar | xiar |
RANLIB | 使用するranlibツール | i586-moblin-linux-ranlib | |
LDFLAGS | リンカーに与えるオプション | (なし) | -L$(PKG_CONFIG_SYSROOT_DIR)/usr/lib -L$(PKG_CONFIG_SYSROOT_DIR)/lib |
CFLAGS | コンパイルオプション | -Wall -Winline -O2 -g $(BIGFILES)(デフォルトのまま) | -Wall -Winline -O2 -ipo -I$(PKG_CONFIG_SYSROOT_DIR)/usr/include -I$(PKG_CONFIG_SYSROOT_DIR)/include $(BIGFILES) |
PREFIX | 「make install」コマンドのインストール先 | /tmp/bzip2_gcc | /tmp/bzip2_icc |
Makefileの編集後「make」コマンドおよび「make install」コマンドを実行すると、PREFIX変数で指定したディレクトリ以下にバイナリが作成される。
$ make $ make install
次に、作成したバイナリ一式をMoblin環境にコピーする。本来はRPMパッケージを作成し、rpmコマンドでのインストールを行うのが推奨されているが、今回はテスト目的であるため、ファイル一式を直接Moblin環境の/usr/localディレクトリ以下にSCPでコピーしている。たとえばインテル コンパイラーで作成したバイナリの場合、次のように実行する。
$ cd /tmp/bzip2_icc $ scp -r * root@<Moblin環境のIPアドレス>:/usr/local/
今回のテストでは、CPUとしてAtom N270(1.60GHz)を搭載するネットブック「EeePC 901」を使用した。スペックやそのほかの環境は次の表7のとおりだ。
構成要素 | スペック |
---|---|
CPU | Atom N270(1.60GHz) |
メモリ | 1GB |
ストレージ | ASUS-PHISON SSD TST2(8GB) |
Linuxカーネルバージョン | 2.6.31.6-17.1.moblin2-netbook |
ベンチマークではFirefox 3.6のソースアーカイブ(firefox-3.6.source.tar.bz2)を使用し、これを展開/圧縮するのにかかった時間をtimeコマンドで計測した。ストレージの読み書きによる影響を抑えるため、展開/圧縮した結果はディスクに書き出さないようにしている。
$ time bzip2 -d -c firefox-3.6.source.tar.bz2 /dev/null (展開) $ time bzip2 -z -c firefox-3.6.source.tar /dev/null (圧縮)
計測は合計4回行い、ディスクキャッシュの影響を抑えるため2回目〜4回目の値を有効な計測結果とした。得られた計測結果は次の表8、'図12のとおりだ。
操作 | コンパイラー | 1回目 | 2回目 | 3回目 | 平均 |
---|---|---|---|---|---|
圧縮 | インテル コンパイラー | 284.311秒 | 283.442秒 | 284.739秒 | 284.16秒 |
GCC | 339.414秒 | 339.375秒 | 339.954秒 | 339.58秒 | |
展開 | インテル コンパイラー | 43.727秒 | 44.030秒 | 43.662秒 | 43.81秒 |
GCC | 44.256秒 | 44.248秒 | 44.539秒 | 44.35秒 |
圧縮については、インテル コンパイラーでコンパイルしたバイナリが、GCCでコンパイルしたものよりも2割近く高速という結果となった。また、展開処理については差は大きくないものの、こちらもインテル コンパイラーのほうが高速という結果が得られている。
Moblinがターゲットとするネットブックやモバイルインターネット端末で採用されているAtom CPUは、一般的なPCで採用されているCore/Celeronシリーズと比べると処理性能が低いため、PC上ではあまり気にならなかった速度差も、Moblin上で実行すると大きく感じられる可能性がある。再コンパイルだけでパフォーマンスの向上を図れるインテル コンパイラーは、パフォーマンスが必要とされるアプリケーション開発において大きく役立つツールと言えるだろう。
[PageInfo]
LastUpdate: 2010-04-08 18:46:12, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members