組込みシステムにおけるインテル® C++ コンパイラーの利用

インテル® DPC++/C++ コンパイラーインテル® System Studio組込み

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Using Intel® C++ Compiler for Embedded System」(http://software.intel.com/en-us/articles/using-intel-c-compiler-for-embedded-system) の日本語参考訳です。


インテル® C++ コンパイラー (icc) は、Linux* オペレーティング・システム向け C/C++ アプリケーションのビルドおよび最適化を行うハイパフォーマンスなコンパイラーであり、さまざまな組込み Linux* システムをサポートしています。インテル® C++ コンパイラーの各種機能を利用して、新しいプロジェクトを作成したり、GNU* コンパイラーの既存のプロジェクトを簡単に移行することができます。

組込みシステム開発は、ほとんどの場合クロスプラットフォーム開発です。通常、アプリケーション開発にはクロスコンパイル環境が必要で、加えてホスト・コンパイル・システムとターゲット組込みシステムが必要になります。インテル® C++ コンパイラーは、クロスプラットフォームのコンパイルも完全にサポートしています。インテル® C++ コンパイラーは、IA ベースの組込みシステム向けにアプリケーションを開発し、最高のパフォーマンスを引き出せる最良のソリューションです。

インテル® C++ コンパイラーは、インテル® System Studio Linux* 版に含まれるコンポーネントの 1 つです。ここでは次のトピックについて説明します。

インテル® C++ コンパイラーの組込み OS サポート

インテル® C++ コンパイラーは、以下を含むさまざまなホスト OS をサポートしています。

ホスト OS ディストリビューション

バージョン

Red Hat* Enterprise Linux*

5、6

Ubuntu*

10.04 LTS、11.04、11.10、12.04 LTS

openSUSE

12.1

SUSE LINUX Enterprise Server*

10 SP4、11 SP2

Debian*

6.0

Pardus*

2011.2 (x64 のみ)

インテル® C++ コンパイラーは、次のターゲット・プラットフォームをサポートしています。

Yocto Project* 1.2、1.3 ベースの環境
CE Linux* PR28 ベースの環境
Wind River* Linux* 5 ベースの環境
Fedora* 14 ベースの環境

インテル® C++ コンパイラーを利用したクロスコンパイル

インテル® C++ コンパイラーは、環境ファイルを使用することで、クロスコンパイルを完全にサポートしています。インテル® System Studio をインストールすると、インストール・フォルダーに複数の .env ファイルが配置されます。“-platform” オプションとともにこれらの .env ファイルを選択することで、特定のターゲット OS 向けにアプリケーションをコンパイルすることができます。

一般に、組込みターゲット向けにアプリケーションをコンパイルする場合は、SDK (ソフトウェア開発キット) をインストールまたはビルドし、SYSROOT (ターゲットシステムのルート) を設定する必要があります。SDK には、gcc* クロスコンパイラーを使ってターゲットシステム向けにアプリケーションをコンパイルするのに必要な gnu binutils、gnu* クロスコンパイラー、ライブラリー、ヘッダーファイルなど、さまざまなツールが含まれています。SYSROOT には、クロスコンパイルに必要なターゲットシステムのライブラリーとヘッダーファイルのパス、および glibc ライブラリーとヘッダーファイルのパスが含まれています。

インテル® C++ コンパイラーのクロスコンパイルには、SDK と SYSROOT が必要です。インテル® C++ コンパイラーは、gcc* クロスコンパイラーのパスを参照してコンパイル時に GNU* ツールのフォルダー構造を検出し、コンパイル後に gnu* の “ar” コマンドと “ld” コマンドを呼び出して最終アーカイブの作成とリンクを行います。また、SYSROOT のパスから、コンパイル時に正しいシステムファイル、glibc ヘッダーファイル、ライブラリーなどを追加します。

インテル® C++ コンパイラーが必要とするすべての情報は、コンパイラーのパッケージに含まれる環境ファイルで定義されています。開発者が行わなければならないのは、環境変数を通して SDK と SYSROOT へのパスをコンパイラーに知らせ、-platform= オプションで正しいターゲット・プラットフォームを指定することです。

例えば、Yocto 1.2 Project* ターゲット向けにアプリケーションをコンパイルするには、YL_SYSROOT および YL_TOOLCHAIN 環境変数を次のように設定します。

YL_SYSROOT=/opt/poky/1.2/sysroots/i586-poky-linux

YL_TOOLCHAIN=/opt/poky/1.2/sysroots/i686-pokysdk-linux/usr/bin

そして、次のコマンドを実行してソースファイルをコンパイルします。

$ icpc -platform=yl12 my_source_file.c

“yl12” はプラットフォーム名で、“yl12.env” 環境ファイルに対応します。このファイルは、インテル® System Studio のインストール・フォルダー (/opt/intel/system_studio_2013.0.xxx/bin/ia32/) にあります。

同様に、Wind River* Linux* 5 ターゲットシステムの場合、次のように環境変数を設定します。

WRL_TOOLCHAIN=<install_dir>/wrl50/wrlinux-5/layers/wr-toolchain/4.6-60

WRL_SYSROOT=<install_dir>/wrl50/<target>/export/sysroot/intel-xeon-core_glibc_std/bitbake_build/tmp/sysroots/intel-xeon-core

<install_dir> は Wind River* Linux* ソフトウェア開発キットのインストール・パスです (例: /export/SDK)。 <target> は ia32 または intel64 です。次のコマンドを実行してアプリケーションをコンパイルできます。

$ icc -platform=wrl50 my_source_file.c

対応する環境ファイルは <install_dir>/bin/<target> にあります。<install_dir> は /opt/intel/system_studio_2013.0.xxx、<target> は ia32 または intel64 です。xxx は、インテル® System Studio のリビジョン番号です。

次の表は、各ターゲット組込み OS 用の環境変数と対応するコンパイラー・オプションです。

ターゲット OS

環境変数

コンパイラー・オプション

Yocto Project* 1.2

YL_SYSROOT

YL_TOOLCHAIN

-platform=yl12

Yocto Project* 1.3

YL_SYSROOT

YL_TOOLCHAIN

-platform=yl13

CE Linux*

CEL_TOOLCHAIN

CEL_SYSROOT

-platform=celpr28

Wind River* Linux*5

WRL_TOOLCHAIN

WRL_SYSROOT

-platform=wrl50

Fedora* 14 ベースのターゲット環境では、使用状況によっては、ほかの組込みシステムとクロスコンパイル・サポートがやや異なります。

ホストシステムとターゲットシステムが同一の場合 (つまり、gnu* ツールのバージョン、OS カーネルのバージョン、glibc のバージョンなどが同じ場合)、ホスト上のネイティブ・コンパイラーと同じようにインテル® C++ コンパイラーを使用できます。この場合、ビルドしたバイナリーをターゲットシステムにコピーするだけで実行できます。

–sysroot オプションで (ホストのデフォルトの sysroot ではなく) ターゲット Linux* システムの SYSROOT を指定し、ホストのネイティブ gnu* ツールを使用してコンパイルする場合は、インテル® C++ コンパイラーを –sysroot オプションとともに使用できます。インテル® C++ コンパイラーは、ターゲットシステム向けに異なるシステムルートを指定できる –sysroot オプションをサポートしています。例えば、ヘッダーとライブラリーが通常の場所 (/usr/include と /usr/lib) にある場合、–sysroot=/mydir を指定すると、コンパイラーは /mydir/usr/include と /mydir/usr/lib にあるヘッダーとライブラリーを検索します。

セルフビルドの gnu* クロスツールの場合は、独自の環境ファイルを定義し、-platform= オプションを使用しなければならないことがあります。カスタマイズされたクロスツールとターゲット OS 用の新しい環境ファイルの作成については、インテル® テクニカルサポートまでお問い合わせください。

テクニカルサポートに関する情報は、http://software.intel.com/en-us/intel-system-studio (英語) を参照してください。

インテル® C++ コンパイラーのランタイム・ライブラリー

インテル® C++ コンパイラーでビルドしたアプリケーションを動的にリンクする場合は、ターゲットシステム上でインテル® C++ コンパイラーのランタイム・ライブラリーを利用できるようにしなければなりません。そのためには、次の操作を行います。

1. ツールスイートのパッケージを書き込みアクセス権のあるディレクトリーに展開します。

$ tar -zxvf l_cembd_p_2013.0.xxx.tgz

2. ftp、sftp、または scp を使用して、作成されたディレクトリー ../l_cembd_b_2013.0.xxx/rpm/ にある system_studio_target.tgz をターゲットデバイスにコピーします。

3. ターゲットデバイス上で、このファイルを書き込みアクセス権のあるディレクトリーに展開します。

$ tar -zxvf system_studio_target.tgz

4. ../system_studio_target/ ディレクトリーが作成され、../system_studio_target/compiler/lib 以下にライブラリーが配置されます。

5. ライブラリーをシステムフォルダーにコピーしてバイナリーの実行時に直接参照されるようにするか、またはバイナリーを実行する前に LD_LIBRARY_PATH 環境変数にライブラリーのパスを追加します。

GNU* コンパイラーからインテル® C++ コンパイラーへの移行

コンパイラーの役割は、C/C++ ソースプログラムをバイナリーに変換し、最適化することです。コンパイルを行うと、C/C++ ソースファイルからオブジェクト・ファイル (.o ファイル) が生成されます。リンカー (ld) は、すべてのオブジェクト・ファイルとその他のシステム・ライブラリーを最終的な実行ファイルにリンクします。 インテル® C++ コンパイラーは、GNU* ツールを認識し、コンパイル後に自動でリンカーを起動します。インテル® C++ コンパイラーは独自のリンカーを提供していません。リンク段階で GNU* リンカーを呼び出します。同様に、アーカイブでも、インテル® C++ コンパイラーは GNU* の “ar” コマンドを使用してアーカイブを作成します。これらすべての自動処理は、インテル® コンパイラーのドライバー (icc、icpc、xiar および xild) によって行われます。

“icc” と “icpc” は、インテル® C++ コンパイラーの起動コマンドです。コンパイル時に C/C++ ソースコードからオブジェクト・ファイルを生成したり、リンク段階で gnu* リンカーを自動で呼び出して複数のバイナリーを 1 つのバイナリーにリンクします。

“xiar” は、“ar” に相当するインテル® コンパイラーのコマンドです。複数のアーカイブファイルに対してさまざまな最適化を行い (可能な場合)、自動で GNU* の “ar” を呼び出してすべてのファイルを 1 つのライブラリーにアーカイブします。

“xild” は、“ld” に相当するインテル® コンパイラーのコマンドです。クロスファイルの最適化を実行してから、GNU* リンカー “ld” を呼び出します。

GNU* の gcc* コンパイラーからインテル® C++ コンパイラーへプロジェクトを簡単に切り替えられます。インテル® C++ コンパイラーへ移行する場合は、次の表を参考にしてください。

CC

CXX

LD

AR

GNU* コンパイラー

gcc

g++

gcc

g++

ld

ar

インテル® C++ コンパイラー

icc

icpc

icc

icpc

xild

xiar

以下は、makefile を使用してビルドするアプリケーションを gcc から icc へ移行する基本的なステップです。

1. 変数 CC を gcc から icc に、CXX を g++ から icpc に、LD が gcc の場合は icc に、LD が g++ の場合は icpc に、LD が ld の場合は xild に、AR を ar から xiar にそれぞれ変更します。

2. クロスコンパイルの場合は、“icc” と “icpc” に -platform=<val> オプションを追加します。

3. クロスコンパイルの場合は、“xiar” と “xild” に -qplatform=<val> オプションを追加します。このオプションにより、“xiar” と “xild” が正しいクロスコンパイル用の “ar” と “ld” を呼び出します。通常、クロスコンパイル用の “ar” と “ld” には、“i686-pc-linux-ar” や “i686-pc-linux-ld” のようにプリフィックスが付いています。-qplatform オプションの <val> は、“icc” と “icpc” で使用される -platform オプションの <val> と同じです。

4. リンク に “icc” または “icpc” を使用すると、インテル® C++ コンパイラーはリンク段階でインテル® C++ コンパイラーのライブラリーを自動でリンクします。リンクに “ld” を使用すると、“xild” に変更後、インテル® C++ コンパイラーのライブラリーを手動で追加しなければならないことがあります。例えば、-L/opt/intel/system_studio_2013.0.xxx/compiler/lib/<arch> オプションを “xild” に追加します。<arch> はターゲット・アーキテクチャーで “ia32” または “intel64” です。さらに、リンカーが正しいインテル・ライブラリーを最終実行ファイルにリンクできるように、-lirc -limf -lsvml などのリンクオプションを “xild” に追加します。そうしない場合、リンカーはインテル・ライブラリーの関数が未定義であると報告します。

5. ほとんどの場合、これでインテル® C++ コンパイラーでプロジェクトをコンパイルできるようになります。

6. 次のステップは、インテル® C++ コンパイラー固有の最適化オプションを追加することです。これは別のトピックなのでここでは取り上げません。次の記事を参照してください。

Step by Step Performance Optimization with Intel® C++ Compiler (http://software.intel.com/en-us/articles/step-by-step-optimizing-with-intel-c-compiler)

インテル® C++ コンパイラーと GNU* コンパイラーの互換性

インテル® C++ コンパイラーは GNU* コンパイラーと互換性があります。GNU* の一般的なオプションと言語拡張の多くは、インテル® C++ コンパイラーでサポートされています。インテル® C++ コンパイラーと GNU* コンパイラーの互換性については、次のホワイトペーパーで詳しく説明しています。

Intel® C++ Compiler for Linux* – Compatibility with the GNU* compilers (http://software.intel.com/en-us/articles/intel-c-compiler-for-linux-compatibility-with-the-gnu-compilers/)

また、インテル® C++ コンパイラーは、GNU* コンパイラーよりも厳しくソースコードをチェックします。ほとんどの場合は警告メッセージが出力されますが、致命的なエラーが出力されることもあります。gcc* ビルドで -Werror オプションを使用している場合、icc でビルドする前にこのオプションを削除してください。そうしないと、インテル® C++ コンパイラーの警告により、多数のエラーが出力される可能性があります。コードの品質を向上させるため、インテル® C++ コンパイラーの警告を調査することを強く推奨します。警告を出力したくない場合は、-diag-disable <v1>[,<v2>,…] オプションにより、指定した診断または診断グループを無効にできます。<vN> は診断メッセージの ID 番号または診断グループ名です。

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

タイトルとURLをコピーしました