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 サンプルのメイクファイルでどのように使われているかを紹介します。
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 に含まれるすべてのサンプルとデモのメイクファイルの基本的な構造は同じです。大体、次のような順で並んでいます :
- サブディレクトリ
- ビルドターゲットとターゲットプロセッサ
- オブジェクト
- コンパイルとリンクのフラグ
- 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 ファイルをインクルードする必要があります。メイクファイルの次のような部分でこれを行っています。 SDK のディレクトリ構造に応じた深さの分だけ ../ をつなげています。
ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../buildutils/make.footer endif |
make.footer の後にビルドルールを追加したい場合もあるでしょう。その場合は、 make.footer のインクルード文の後にルールを追加してください。
本ビルド環境では、以下のような基本的なビルドターゲットをいくつか提供しており、コマンドラインから利用できます :
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) があるディレクトリです。
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 の変数について(そしてそれを使って疑似ビルド環境を使う方法について)解説しました。本記事が、サンプルやデモプログラムをビルドする方法を理解する助けになるでしょう。
学ぶために
- RSS feedを使って、このシリーズの更新をチェックしましょう(developerWorks Japan RSS フィードについてはこちら)。
- このシリーズの第 1 回もどうぞ :
"A close-up on SDK 3.0, Part 1: Rebuilding code from src.rpm"
(developerWorks, 2008) では、 SDK 3.0 の src.rpm に含まれるコードのインストール方法およびビルド方法を紹介しています。 SDK 3.0 ですが、まだまだ参考になります。
- GCC online documentation repository は、 GCC のマニュアルの宝庫です。リリース 2.95.3 から 4.3.2 までに加え、現在行われている開発に関するユーザ向けと内部向けの資料もそろっています。
- information
center for IBM compilers supporting Cell/B.E. processorsには、IBM XL C/C++ for Multicore Acceleration for Linux™ 9.0 および
IBM XL FORTRAN for Multicore Acceleration for Linux 11.1 を含む、 SDK 3.0/3.1 の C または FORTRAN 用の各コンパイラについての情報があります。
-
Cell Resource Center's Docs page には、思いつく限りのすべての Cell/B.E. 関連ドキュメント —ガイド, ハンドブック, チュートリアル, 仕様書— があります。
"Programmer's
Guide to the IBM SDK for Multicore Acceleration" へのリンクもここです。
-
IBM Systems® Information Center は、 IBM Systems のハードウェア、オペレーティングシステムそしてサーバー製品に関する製品ドキュメントを、ワンストップで探せる情報センターです。
ナビゲーションバーを選んで SDK ドキュメントへ進みましょう : System software > Cell
Broadband Engine solution > Software Deelopment Kit > Software Deelopment Kit 3.1。
- おもな Cell/B.E. 関連テクノロジを、まとめて素早く知りたい方は :
- Programming with ALF: このシリーズ (developerWorks, October 2007-July 2008) には、 SDK の Accelerated Library Framework について解説した、短いガイド集と少し詳しい記事がまとまっています。
- Programming with DaCS: このシリーズ (developerWorks, October 2007-August 2008) には、SDK の Data Communication and Synchronization サービスについて解説した、短いガイド集と少し詳しい記事がまとまっています。
- Programming with BLAS: このシリーズ (developerWorks, November 2007-July 2008)には、SDK の Basic Linear Algebra Subroutines ライブラリについて解説した、短いガイド集と少し詳しい記事がまとまっています。
- もっとCell/B.E.プログラミングを学ぶには、次のdeveloperWorksシリーズに挑戦しましょう:
- "Programming high-performance applications on the Cell/B.E. processor"
- "PS3 fab-to-lab"
- "The little broadband engine that could"
- The IBM Semiconductor Solutions Technical Library のCell Broadband Engine documentation セクションには、ダウンロードマニュアルや、仕様書などたくさんの有益な情報があります。
- developerWorks ニュースレターに登録すると、最新の開発者向けニュースと Cell/B.E.に関する最新情報を毎週メールで受け取れます。ニュースレターで Cell/B.E.関連のニュースを受信するには、登録する際にPower Architecture® にチェック・マークを付けてください。
製品や技術を入手するために
- IBM SDK for Multicore Acceleration 3.1を入手しましょう。また、Cell/B.E.資料のライブラリーにも情報が網羅されています。
- 全ての Cell/B.E.関連記事、ディスカッションフォーラム、ダウンロードなどは IBM developerWorks の Cell Broadband Engine resource center にあります。
- Cell/B.E.カスタム製品やカスタムプロセッサを用いたソリューションのお問い合わせはこちら: Contact us about Cell Broadband Engine technology。
議論するために
- ディスカッション・フォーラムに参加してください。
- 質問はIBM developerWorks Power Architecture Cell Broadband Engine discussion forum へ投稿してください。フォーラムに投稿された興味深い問題と答えは、定期的に集められたこちらの"Forum watch" ブログシリーズでハイライトされています。
- Cell Broadband Engine/Power Architecture ブログにアクセスして、Cell/B.E.やその他の Power Architecture 関連技術に関するニュース、ダウンロード、資料、イベント通知を参照してください。人気の高い"Forum watch"ブログ・シリーズ (Q&A 要約) と"FixIt"技術更新情報、それに Infobomb の技術要約も用意されています。
