 | レベル: 初級 Brian Horton, Cell/B.E. Software Developer, IBM
2008年 11月 25日 Cell/B.E. SDK 3.1 で提供されている make.footer ファイルをメイクファイルへインクルードすると、サンプルやデモプログラムをビルドするのに便利な疑似的「ビルド環境」を利用できます。本記事では、make.footer ファイルで利用可能な機能や特徴と、それらが SDK のサンプルプログラムでどのように使われているか解説します。
Cell Broadband Engine™ (Cell/B.E.)™ SDK を使ったコード開発は、少々面倒なものであり、特別なメイクファイルを必要とします。 Cell/B.E. アプリケーションをビルドするには、次に示す 2 セットのツールを使う必要があり、一般の make でこれを行うのは少々荷が重いという方もいらっしゃるでしょう。
- ppu-gcc と spu-gcc でオブジェクトファイルを作成
- ppu-embedspu でそれらを結合
make.footer メイクファイルを使った疑似ビルド環境は、Cell/B.E.™ アーキテクチャの開発初期段階に作成されました。この環境は時と共に進化を遂げてきていますが、 make.footer は全ての機能を網羅したビルド環境ではありません。基本的な Cell/B.E. コードを構築するのに十分な機能はサポートしていますが、実のところ SDK に同梱されているサンプルやデモのコードをビルドすることのみを目的として設計されたものです。
本記事では、 make.footer で利用可能な変数を紹介し、それらが SDK サンプルのメイクファイルでどのように使われているかを紹介します。
make の環境ファイル群
SDK 3.1 には make を正しく動かすのに必要な 3 つの環境ファイルがあります。
- make.header
このファイルにはメイクファイルの処理に先立って必要な定義が含まれています。また、このファイルが主要な make 環境ファイルの 1 つである make.env のインクルードも行います。
- make.env
このファイルは、 make で使用されるデフォルトのコンパイラやツールの設定を行います。ユーザ環境変数を定義するか、このファイルを編集することで、これらの設定を上書きできます。 SDK 3.1 で利用可能なコンパイラ指定用変数は以下のとおりです :
HOST_COMPILER コードをホストシステム用にビルドする場合にデフォルトで使われるコンパイラを指定します。
PPU_COMPILER,
PPU32_COMPILER,
PPU64_COMPILER 32 ビットまたは 64 ビットの PPU 用 C コンパイラを指定します (gcc または xlc) 。
SPU_COMPILER SPE 用 C コンパイラを指定します (gcc または xlc) 。
FTN_PPU_COMPILER,
FTN_PPU32_COMPILER,
FTN_PPU64_COMPILER 32 ビットまたは 64 ビットの PPU 用 FORTRAN コンパイラを指定します。 (gfortran または xlf) 。
FTN_SPU_COMPILER SPE用 FORTRAN コンパイラを指定します。 (gfortran または xlf) 。
XLC_REL,
XLF_REL xlc および xlf のリリースナンバーを指定します。
SPU_TIMING 生成された全てのアセンブリファイル (.s) について、自動的に静的タイミング解析ファイル (訳注 : .s.timing) も生成するかどうかを指定します。
- make.footer
このファイルは、適用されるすべてのビルドルールを定義しています。ユーザはこのファイルを変更してはなりませんが、フラグのデフォルト値やビルド手順の理解に役立ちます。
SDK サンプルのメイクファイルを解剖する
SDK に含まれるすべてのサンプルとデモのメイクファイルの基本的な構造は同じです。大体、次のような順で並んでいます :
- サブディレクトリ
- ビルドターゲットとターゲットプロセッサ
- オブジェクト
- コンパイルとリンクのフラグ
- make.footer のインクルード
サブディレクトリ
このディレクトリのターゲットをビルドする前に処理したいサブディレクトリを指定します :
DIRS := <スペースで区切られたサブディレクトリのリスト>
|
複数のプログラムをビルドするために使われたり、別ディレクトリにある SPU コードをビルドするために使われたりしています。
ビルドターゲットとターゲットプロセッサ
ビルドターゲットとターゲットプロセッサを指定する方法は何種類かあります。注意すべきは、このビルド環境では1つのメイクファイル (ディレクトリ) で 1 種類のプロセッサ種別にしか対応していないということです。複数のプロセッサ向けにビルドする場合は、別々のディレクトリ及びメイクファイルにする必要があります。ですので、 SPU コードは常に別のディレクトリに置かれているのです。サンプルによって、 PPU 用のコードが上位のディレクトリにあったり、 PPU 用ディレクトリと SPU 用ディレクトリが同じ場所にあったりします。
ターゲットプロセッサを指定するには、次のようにします :
TARGET_PROCESSOR := "spu" | "ppu" | "ppu64" | "host"
|
ビルドするプログラムまたはプログラムのリストを指定します :
PROGRAM := <プログラム>
PROGRAMS := <スペースで区切られたプログラムのリスト>
|
別の方法として、プログラムとプロセッサ種別を一度に指定することもできます。この方法は ppu (32 ビット ) と ppu64 (64 ビット ) のプログラムを区別するためによく用いられます。
PROGRAM_<ターゲット> := <プログラム>
PROGRAMS_<ターゲット>:= <スペースで区切られたプログラムのリスト>
|
ライブラリターゲットの名前 (共有または非共有) の指定には次のいずれかを用います :
LIBRARY := <ライブラリ名>
SHARED_LIBRARY := <共有ライブラリ名>
|
SPU プログラムを PPU の実行ファイルに埋め込むためのライブラリを作成するには、次のどちらかを用います (PPU の実行形式が 32 ビットであるか 64 ビットであるかによって異なります) :
LIBRARY_embed := <ライブラリ名>
LIBRARY_embed64 := <ライブラリ名>
|
プログラムでもライブラリでもないその他のビルドターゲットがある場合に使います :
OTHER_TARGETS := <スペースで区切られたその他のプログラム>
|
オブジェクト
ほかにビルドすべきオブジェクトがあれば、それを指定する方法があります。
カレントディレクトリ以外のディレクトリのファイルを入力として使う場合、 VPATH ディレクティブで定義できます。 SDK サンプルの中に、 32 ビットと 64 ビットの PPU コードを同じソースファイルから作成するためにこの方法を使っている例があります。
VPATH := <コロンで区切られたパスのリスト>
|
全オブジェクトファイルを指定しない場合は、ターゲット(ライブラリまたはプログラム)はソースディレクトリにあるソースファイルから生成したすべてのオブジェクトを生成して取り込みます (VPATH で指定されたものも含みます)。代わりにオブジェクトファイル名を直接指定することもできます。
OBJS := <スペースで区切られたオブジェクトファイルのリスト>
|
各プログラム毎に ( または特定のプログラムだけ ) オブジェクトファイルを指定する場合は次のようにします :
OBJS_<プログラム名> := <スペースで区切られたオブジェクト名のリスト>
|
コンパイルとリンクのフラグ
コンパイル、アセンブル、リンクに関するフラグを設定するための定義もあります。 メイクファイルにこれらを書き込むことで、デフォルトの動作を変更できます。 以下のようなものがあります :
CPPFLAGS,
CPPFLAGS_gcc,
CPPFLAGS_xlc,
CPPFLAGS_<プログラム名>
C プリプロセッサのためのフラグを指定します。デフォルトコンパイラまたはコンパイラごとに全プログラム一括指定、または、プログラムごとの指定もできます。
CC_OPT_LEVEL 最適化レベルを指定します。デフォルトは -O3 です。$(CC_OPT_LEVEL_DEBUG) を指定すると、デバッグ用のビルドを行えます。
CFLAGS,
CFLAGS_gcc,
CFLAGS_xlc,
CFLAGS_<プログラム名>
C コンパイラの追加フラグを指定します。デフォルトコンパイラまたはコンパイラごとに全プログラム一括指定、または、プログラムごとの指定もできます。
CXXFLAGS,
CXXFLAGS_<プログラム名>
C++ コンパイラの追加フラグを指定します。デフォルトコンパイラまたはコンパイラごとに全プログラム一括指定、または、プログラムごとの指定もできます。
FFLAGS FORTRANコンパイラの追加フラグを指定します。
INCLUDE 追加のインクルードディレクトリを、 -I を前につけて追加します。
ASFLAGS,
ASFLAGS_<プログラム名>
アセンブラの追加フラグを指定します。全プログラム一括指定のほか、プログラムごとの指定もできます。
LDFLAGS,
LDFLAGS_gcc,
LDFLAGS_xlc,
LDFLAGS_<プログラム名>
リンカの追加オプションを指定します。デフォルトコンパイラまたはコンパイラごとに全プログラム一括指定、または、プログラムごとの指定もできます。
IMPORTS,
IMPORTS_<プログラム名>
リンクするライブラリまたはオブジェクトファイルを指定します。全プログラム一括指定のほか、プログラムごとの指定もできます。パス名とファイル名のほか、リンカの検索パス内に存在する libname.so または libname.a に対しては -lnameの形式での指定も可能です。
TARGET_INSTALL_DIR ビルド後に、作成されたすべてのプログラムをインストール (コピー) する先のディレクトリを指定します。
INSTALL_FILES,
INSTALL_DIR インストールされるファイルとディレクトリのリストを指定します。こちらは、ビルドするコードでないもの、たとえばデータファイルやヘッダファイルのコピーなどに使います。
make.footer のインクルード
サンプルのメイクファイルが本記事で紹介されている変数を使うためには、 make.footer ファイルをインクルードする必要があります。メイクファイルの次のような部分でこれを行っています。 SDK のディレクトリ構造に応じた深さの分だけ ../ をつなげています。
ifdef CELL_TOP
include $(CELL_TOP)/buildutils/make.footer
else
include ../../buildutils/make.footer
endif
|
make.footer の後にビルドルールを追加したい場合もあるでしょう。その場合は、 make.footer のインクルード文の後にルールを追加してください。
make で使えるターゲット
本ビルド環境では、以下のような基本的なビルドターゲットをいくつか提供しており、コマンドラインから利用できます :
all ターゲットが指定されない場合に使われるデフォルトのビルドターゲットです。dirs, libraries, programs, misc_, install の各ターゲットのビルドを含みます。
dirs ディレクトリツリーを移動しながら、指定されたターゲットをビルドします。通常、libraries,
programs, misc_, install の各ターゲットと組み合わせて使われます。
libraries
LIBRARY,
SHARED_LIBRARY,
LIBRARY_embed の各ターゲットのみをビルドします。
programs
PROGRAM_<target> と
PROGRAMS_<target> ターゲットのみをビルドします。
misc_
OTHER_TARGETS を含むその他のターゲットをビルドします。その他のターゲットの種類については make.footer を参照してください。
install ビルドされたターゲットをインストールします。TARGET_INSTALL_DIR,
INSTALL_FILES および
INSTALL_DIR の各定義も参照してください。
clean すべてのビルドまたはインストールされたターゲット、オブジェクトファイル、ライブラリ、プログラムを削除します。
listenv カレントディレクトリに適用されるコンパイル環境を表示します。このターゲットは、 make によって使われるターゲットやツール、フラグ指定を参照するためのデバッグ用です。
その他の便利なメイクファイル変数について
ビルド環境によって定義されたその他の変数を使っているメイクファイルもあります。これらの変数の利点は、 PPU と SPU の区別 (例えば /usr/include と /usr/spu/include) や、 32 ビットと 64 ビットの区別 (例えば /usr/lib と /usr/lib64) や、ネイティブ開発環境 (QS22、GigaAccel180、PS3 などの PowerPC マシン) とクロス開発環境 (x86 マシン) の区別 (例えば /usr/include と /opt/cell/sysroot/usr/include) が、 make.footer によって自動的に扱える点です。
次の変数はファイルを読み込むディレクトリを与えます ( -L と -I のディレクトリ ) :
$(SDKBIN),
$(SDKLIB),
$(SDKINC) 正式版のコードが含まれる bin, library, include のディレクトリパスです (/usr/bin など ) 。
$(SDKEXBIN),
$(SDKEXLIB),
$(SDKEXINC) SDK サンプルコードの bin, library, include のディレクトリパスです (/opt/cell/sdk/usr/bin など ) 。
$(SDKPRBIN),
$(SDKPRLIB),
$(SDKPRINC) SDK のプロトタイプコードの bin, library, include のディレクトリパスです (/opt/cell/sdk/prototype/usr/bin など )。
次の変数はファイルがインストール(エクスポート)された場所を与えます :
$(EXP_SDKBIN),
$(EXP_SDKLIB),
$(EXP_SDKINC) インストールされたコードの bin, library, and include ディレクトリパスです (/opt/cell/sdk/) 。
リンカの -R フラグとともに使用される、ランタイムライブラリの場所を示す変数です :
$(SDKRPATH),
$(SDKEXRPATH),
$(SDKPRRPATH) 正式版コード、サンプル、プロトタイプの各ライブラリがインストールされたディレクトリパスです (/opt/cell/sdk/usr/lib) 。
シミュレータ関連の変数です :
$(SYSTEMSIM_INCLUDE) callthuru と関連ヘッダファイル (profile.h) があるディレクトリです。
その他の SDK ビルドツール
make.footer だけでなく、他にもサンプルのビルドや実行を制御するツールがあります。
cellsdk_select_compiler このツールは /opt/cell/sdk/buildutils ディレクトリにあり、gnu gcc/gfortran と IBM XL xlc/xlf コンパイラを切り替えるために使われます(後者はインストールされている場合のみ)。オプションなしで実行すると、使用できるオプションを表示します。このスクリプトは ${CELL_TOP}/buildutils/make.env ファイルを書き換え、デフォルトコンパイラを変更することができます。
cellsdk_sync_simulator このツールは /opt/cell ディレクトリにあり、ビルド環境の sysroot からシミュレータの sysroot にファイルをコピーするために使用されます。サンプルファイルを再構築すると、 各バイナリは /opt/cell/sysroot ディレクトリ以下にインストールされます。 cellsdk_sync_simulator スクリプトを使って、 この sysroot とシミュレータが使う sysroot の内容を同期しましょう。
まとめ
本記事では、 IBM SDK for Multicore Acceleration 3.1 に含まれている make.footer の変数について(そしてそれを使って疑似ビルド環境を使う方法について)解説しました。本記事が、サンプルやデモプログラムをビルドする方法を理解する助けになるでしょう。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Brian Horton は2007年のはじめから、 Cell/B.E. SDK 開発チームとしてサンプルやビルド環境の構築、そして DaCS ライブラリの開発を行っています。 |
記事の評価
|  |