XL C/C++ Advanced Edition では以下のオペレーティング・システムがサポートされるようになりました。
XL C/C++ Advanced Edition の新規フィーチャーおよび機能拡張は、以下の 3 つのカテゴリーに分類することができます。 パフォーマンスおよび最適化、業界標準への準拠、および使用上の利便性です。
新フィーチャーと機能拡張の多くは、最適化とパフォーマンス・チューニングに分類されるものです。
オプション -qarch および -qtune の改良
コンパイラー・オプション -qarch を使用すると、指定されたマシン・アーキテクチャーに生成される特定の命令を制御することができます。 また、オプション -qtune を使用すると、命令、スケジューリング、および他の最適化を調整し、 指定されたハードウェアのパフォーマンスを向上することができます。 これらのオプションを共に使用すると、指定されたアーキテクチャーに最良のパフォーマンスを与える アプリケーション・コードを生成できます。 この 2 つのオプションを組み合わせてうまく使用することが、IBM プロセッサーおよびハードウェアを 最大限に活用する鍵となります。 本リリースでは、これらのオプションの組み合わせを機能拡張することにより、POWER5 および PowerPC 970 ハードウェア・プラットフォームがサポートされ、また使いやすさも向上しました。
-qarch で特定のアーキテクチャーを指定した場合、デフォルトの -qtune サブオプションを使用してコンパイルすると、そのアーキテクチャーに最適なパフォーマンスを 与えるコードを生成します。 現在、オプション -qarch には、アーキテクチャーのグループを指定することができます。 -qtune=auto を使用してコンパイルすると、指定したグループ内の全アーキテクチャーで 稼働するコードを生成しますが、命令シーケンスはコンパイルするマシンのアーキテクチャーで 最適なパフォーマンスを行うものになります。
-qarch のデフォルト設定は、ご使用のプラットフォームによって異なります。
AltiVec (VMX) のサポート
XL C/C++ for Linux は、AltiVec プログラミング・モデルをサポートし 、GNU C および C++ コンパイラーとの最大限の互換性を確保するための追加のフィーチャーを提供します。 AltiVec のデータ型および関連する演算は、アーキテクチャーが PowerPC SIMD 拡張 (別名 VMX エンジン) をサポートしていれば、32 ビットおよび 64 ビット・モードで使用可能です。 SIMD (Single Instruction, Multiple Data) 命令セットにより、 マイクロプロセッサー・ハードウェアの使用率をより高くできます。 コンパイラーは、高レベルの最適化で自動的に SIMD ベクトル化を使用可能にする機能を提供します。
以下の組み込み関数が POWER5 プロセッサーでもサポートされるようになりました。
サポートされているすべての組み込み関数は、「XL C/C++ コンパイラー・リファレンス」に
詳しく説明されています。
POWER5 プロセッサーのための組み込み関数 | |
関数 | 説明 |
---|---|
int __popcnt4(unsigned int); | 32 ビット整数のビット・セット (=1) の数を戻します。 |
int __popcnt8 (unsigned long long); | 64 ビット整数のビット・セット (=1) の数を戻します。 |
unsigned long __popcntb (unsigned long); | ソース・オペランドの各バイトで 1 ビットをカウントし、 そのカウントを対応する結果のバイトに入れます。 |
int __poppar4(unsigned int); | ビットの奇数が 32 ビットの整数に設定されている場合、1 を戻します。 その他の場合は、0 を戻します。 |
int __poppar8 (unsigned long long); | ビットの奇数が 64 ビットの整数に設定されている場合は、1 を戻します。 その他の場合は、0 を戻します。 |
double __fre(double); | 浮動小数点逆数演算の結果を戻します。 結果は、1/x の倍精度の推定値です。 |
float __frsqrtes(float); | 逆数平方根演算の結果を戻します。結果は、x の平方根の逆数の単精度推定値です。 |
unsigned long __mfspr(const int); | 指定の特殊目的のレジスターに値を戻します。 |
void __mtspr(const int, unsigned long); | const int で指定した特殊目的のレジスターを設定します。 |
unsigned long __mfmsr(); | マシン状態レジスターを戻します。 |
void __mtmsr(unsigned long); | マシン状態レジスターを設定します。 |
void __protected_unlimited_stream_set_go(unsigned int direction, const void* addr, unsigned int ID); | ID ID を使用する無制限の長さの protected ストリームを確立します。ストリーム ID の 範囲は、0 から 15 である必要があります。ストリームは addr でキャッシュ・ラインから開始します。 ストリームは、direction で指定したように、インクリメンタル・メモリー・アドレス またはデクリメンタル・メモリー・アドレスのいずれかから取り出します。インクリメンタル・メモリー・アドレス (すなわち順方向) の場合 direction の値は 1 で、デクリメンタル・メモリー・アドレス の場合 direction の値は 3 です。 ストリームは、ハードウェア検出ストリームによって置き換えられることはありません。 |
void __protected_stream_set(unsigned int direction, const void* addr, unsigned int ID); | ID ID を使用する限られた長さの protected ストリームを確立します。ストリームは addr でキャッシュ・ラインから開始し、その後、direction で指定したように、 インクリメンタル・メモリー・アドレスまたはデクリメンタル・メモリー・アドレスのいずれかから取り出します。 ストリームは、ハードウェアで検出されるストリームに置き換えられないように 保護されます。 |
void __protected_stream_count(unsigned int unit_cnt, unsigned int ID); | ID によって識別する限られた長さの protected ストリームにキャッシュ・ライン数を設定します。 キャッシュ・ライン数は、パラメーター unit_cnt によって指定し 、0 から 1023 の範囲にする必要があります。 |
void __protected_stream_go(); | すべての限られた長さの protected ストリームの事前取り出しを開始します。 |
void __protected_stream_stop(unsigned int ID); | ID によって識別する protected ストリームの事前取り出しを停止します。 |
void __protected_stream_stop_all(); | すべての protected ストリームの事前取り出しを停止します。 |
このリリースには、浮動小数点除法用の 4 つの新規組み込み関数が組み込まれました。 浮動小数点除法アルゴリズムのソフトウェア・インプリメンテーションは、PowerPC アーキテクチャーを利用しており、また、ベクトル・コンテキストでの使用時に、 対応するハードウェア命令よりもかなり高速になる可能性があります。 これらの新規の組み込み関数は、POWER5 を含む、すべての PowerPC プロセッサーでサポートされます。
ハードウェア除法命令は、ソース・プログラムに浮動小数点除法がコード化されているが、
コンパイラーがより高速と考える程度に応じて、ハードウェアまたはソフトウェアの除法コード
の間での選択を行う場合、デフォルトで取得されます。
ユーザーは新規の組み込み関数を使用することで、明示的にソフトウェア・アルゴリズムを呼び出すことができます。
これらのルーチンを呼び出す際、デフォルトの丸めモード (最近似値に丸め) が有効でなければなりません。
浮動小数点除法のための組み込み関数 | |
関数 | 説明 |
---|---|
double __swdiv_nochk(double, double); | double 型の浮動小数点除法。範囲検査なし。 引き数の制約事項: 無限大に等しい分子、または、無限大、ゼロ、または正規化解除に等しい分母は許可されません。 分子と分母の商が正または負の無限大であってはなりません。 |
double __swdiv(double, double); | double 型の浮動小数点除法。 引き数の制限はなし。 |
float __swdivs_nochk(float, float); | float 型の浮動小数点除法。範囲検査なし。 引き数の制約事項: 無限大に等しい分子、または、無限大、ゼロ、または正規化解除に等しい分母は許可されません。 分子と分母の商が正または負の無限大であってはなりません。 |
float __swdivs(float, float); | double 型の浮動小数点除法。 引き数の制限はなし。 |
プラグマ・ディレクティブは「XL C/C++
コンパイラー・リファレンス」に詳しく説明されています。
プラグマ | 説明 |
---|---|
#pragma novector | コンパイラーが、直後に続くループを自動的にベクトル化することを禁止します。自動ベクトル化は、 配列の連続するエレメントのループで実行される特定の操作を、同時に幾つかの結果を計算するルーチンに対する呼び出しに変換することを意味します。 |
#pragma nosimd | コンパイラーが、直後に続くループで自動的に VMX 命令を生成することを禁止します。 |
#pragma unrollandfuse | ネストされた for ループを最適化するプラグマ。コンパイラーに命令して、 外部ループの本体部分、つまりループ・ネスト自体を複製し、複製したものを単一のループ・ネストに 展開します。 |
#pragma stream_unroll | for ループに含まれるストリームを複数のストリームに分割します。 大規模な反復数および小規模なストリーム数を持つループを対象としています。 |
#pragma block_loop | コンパイラーに命令して、ループ・ネストの特定の for ループのためにブロック化ループを作成します。 ブロック化ループとは、ループの反復部分をパーツまたはブロックに分割したものです。 ブロック化ループ という外部ループを追加で作成し、 このループの各ブロックで元のループを実行します。 |
#pragma loopid | for ループにスコープ固有の ID でマークを付けます。ID は、 そのループでの変換を制御するため、およびオプション -qreport の使用によってループ変換に関する情報を提供するために、#pragma block_loop および他のプラグマによって使用することができます。 |
#pragma disjoint | C++ インプリメンテーションの追加。 |
#pragma unroll の拡張 | ループの展開とは、ループを完了するのに必要な反復数を減らすために、 ループの本体部分を複製することです。 #pragma アンロール・ディレクティブを指定すると、このディレクティブの直後に記述されている for ループが展開可能であることをコンパイラーに示します。 このプラグマの機能が拡張され、最内部および最外部の両方の for ループに適用することが できるようになりました。 ただし、拡張された #pragma 機能では、代替エントリー・ポイントを持つ for ループへの適用は まだ含まれていません。 |
このリリースには、プロファイル指示フィードバック (PDF) コンパイル・プロセスに関連した 2 つの 新しいユーティリティーが含まれています。 プロファイル指示フィードバックを使用することにより、 コンパイラーは、その実行可能ファイルを幾つかの異なるシナリオで実行した結果に基づいて、 実行可能ファイルを最適化できます。 計測する実行可能ファイルをいずれかのシナリオで実行すると、 副次的に PDF レコードも作成されます。 このレコードは、そのプログラムの典型的な動作を定義するために照合するデータとなります。
showpdf コマンドでは、 プロファイル指示フィードバック・トレーニング実行として実行したすべてのプロシージャーの 呼び出しおよびブロック数を表示できます。 このユーティリティーでは、オプション -qpdf1 と -qshowpdf を指定してコンパイルする必要があります。
mergepdf コマンドでは、ユーザーが 2 つ以上の PDF レコードの 関連する重要な部分を指定し、1 つのレコードに組み合わせることができます。 これにより、ユーザーはより高い実行カウント (より長い実行時間) のトレーニング実行を補正し、 そのトレーニング実行だけがプロファイル・データを決定付けてしまわないようにすることができます。
コンパイラーは、IBM Mathematics Acceleration Subsystem (MASS) ベクター・ライブラリーの 32 ビットおよび 64 ビットのモード・バージョンに対するサポートを追加します。それぞれ、libmassvp4.a および libmassvp4_64.a です。これらのライブラリーには、 単精度および倍精度の逆数および平方根関数用のベクター・ルーチンが含まれます。 ベクター・ライブラリーはスレッド・セーフで、対応する libm ルーチンに対して改良されたパフォーマンスを提供します。
バージョン 7.0 から、コンパイラーとともに MASS ライブラリーが配布されるようになりました。
C、C++、および Fortran に対する OpenMP API V2.0 サポート
OpenMP アプリケーション・プログラム・インターフェース (API) は、移植可能で拡張が容易な プログラミング・モデルであり、マルチプラットフォームでメモリーを共用する並列アプリケーションを C、C++、および Fortran で開発するための標準インターフェースを提供します。 OpenMP API の仕様は、OpenMP 組織という、IBM を含む主なコンピューター・ハードウェアおよび ソフトウェア・ベンダーの集まりによって定義されます。 XL C/C++ Advanced Edition は OpenMP 仕様 2.0 に準拠しています。 コンパイラーは、以下の OpenMP V2.0 エレメントのセマンティクスを認識し、保持します。
拡張ユニコードおよび NLS サポート
C 標準委員会の最近のレポートでは、C コンパイラーで C99 を拡張し、 新規データ型を追加して UTF-16 および UTF-32 リテラルをサポートすることを推奨しています。 また、C++ コンパイラーでも、C との互換性のために、 これらの新規データ型をサポートすることを推奨しています。
Boost ライブラリーに対するサポート
XL C++ コンパイラーは、1.30.2 Boost ライブラリーでの 高レベルの互換性を実現します。これらのライブラリーは再使用可能セット、標準化に適切な Open Source C++ ライブラリーを提供するために作成されました。 詳しくは、Boost Web サイト http://www.boost.org を参照してください。
GNU C および C++ に関連する言語拡張機能
C99 に対する GNU C 拡張および標準 C++ に対する GNU C++ 拡張は、業界標準ではありません。
しかし、独自のものではなく、ある程度一般的となっているオープン・ソース・コミュニティーの
言語フィーチャーです。
XL C/C++ は、GNU C および C++ 拡張のサブセットをインプリメントしています。
本リリースでは、以下の GNU C フィーチャーに対するサポートが追加されています。
フィーチャー | 注釈 |
---|---|
ラベルを値として使用 | 計算済み goto 文を含む。 このフィーチャーは現在、GNU C インプリメンテーションと完全に互換性があります。 |
型属性 | 属性 aligned、packed、transparent_union。 |
関数属性 | 属性 format、format_arg、always_inline、noinline。 |
変数属性 | 属性 section に追加された C++ サポート。 |
代替キーワード | __extension__ のインプリメンテーションを内部的に変更。 |
ネストされた関数 |
![]() |
共用体型へのキャスト |
![]() |
引き数の変数番号を含むマクロ | __VA_ARGS__ 引き数が指定されていない 場合、__VA_ARGS__ の代わりに ID を使用し、末尾のコンマを除去する。 |
C の式オペランドを使用する gcc インライン・アセンブラー命令 | 部分的なサポートのみ。 |
GNU C 複素数型 | C++ サポートが追加されました。 |
GNU C 16 進浮動小数点定数 | C++ サポートが追加されました。 |
C99 複合リテラル | C++ サポートが追加されました。 |
長さゼロの配列 | C++ サポートが追加されました。 |
可変長配列 | C++ サポートが追加されました。 |
新規 C++ コンパイラー呼び出し
コンパイラー呼び出し xlc++ が、 すべてのサポートされているプラットフォームで移植可能になりました。 この呼び出しは、すべてのプラットフォームで使用可能な呼び出し xlC と 同等であり、使用を推奨されています。ただし、xlC も 完全にサポートされています。
資料
各コンパイラー呼び出しコマンドと 各コマンド行ユーティリティーに関するマニュアル・ページが提供されています。 コンパイラー呼び出しに対するマニュアル・ページは、前のリリースで 提供されていたテキストのヘルプ・ファイルを置き換えるものです。
テンプレート・レジストリー機能拡張
C++ コンパイラーは、テンプレートのインスタンス化の登録による、 テンプレートのインスタンス化のバッチ処理スキームを使用します。 本リリースでは、このコンパイラーにより、作成されるテンプレート・レジストリー・ファイルに バージョン管理情報を追加しています。 この情報は、コンパイラーによって内部的に使用され、どのバージョンの テンプレート・レジストリー・ファイル・フォーマットを使用する必要があるかを追跡します。
新規および変更されたコンパイラー・オプションが、
「オンライン・ドキュメンテーション」で詳しく説明されています。
オプション | 説明および注釈 |
---|---|
-qabi_version=n | バージョン n の C++ ABI を使用するように、コンパイラーに指示します。
ただし、n には以下を指定できます。
デフォルトはオペレーティング・システムによって異なります。
|
-qaltivec | AltiVec データ型に対するコンパイラー・サポートが使用可能です。デフォルトは -qnoaltivec です。 |
-qasm=gcc | C の式オペランドによるアセンブラー命令に対する部分的サポートを使用可能にします。 asm キーワードおよびその代替スペルを認識し、gcc 構文およびキーワードのセマンティクスを 使用するようコンパイラーに命令します。 デフォルトは、-qnoasm です。 |
-qasm_as | asm ディレクティブでコードを処理するために、 代替アセンブラー・プログラムを呼び出すのに使用するパスおよびフラグを指定します。 このオプションは、コンパイラー構成ファイルで定義される as コマンドのデフォルト設定をオーバーライドします。 |
-qdirectstorage | ライトスルー使用可能またはキャッシュ禁止ストレージが、 一定のコンパイル単位で参照される可能性があることを表明します。 このオプションの意図は、PowerPC アーキテクチャーで使用可能な 異なるストレージ管理属性のために、予期しない振る舞いを行わないようにすることです。 デフォルトは、-qnodirectstorage です。 |
-qenablevmx | コンパイラーに対し、任意のコンパイラー・フェーズで VMX (AltiVec) コ ードを生成するよう命令します。 このオプションによって、開発環境におけるオペレーティング・システムに対する -qaltivec の正しいデフォルト設定を確実にします。RHEL 3 U3 および Y-HPC の場合、デフォルトは-qnoenablevmx です。RHEL 4 および SLES 9 の場合、デフォルトは -qenablevmx です。 |
-qkeepparm | パフォーマンスを改善するために、異なるメモリー・ロケーションに移動させる代わりに、 レジスターに渡される関数のパラメーターがスタックに確実に保管されるようにします。 デフォルトは、-qnokeepparm です。 |
-qipa=threads[=N] | nothreads | N スレッドを作成し、並行して最大 N 個のバックエンドを実行するように、最適化プログラムに指示します。 ここで、N は、1-MAXINT の範囲の整数です。 デフォルトは nothreads サブオプションです (これは、単一シリアル処理の実行に相当します)。 このフィーチャーを使用すると、マルチプロセッサー・コンピューターで IPA リンクに要する時間を削減することができます。 |
-qnoprefetch | 自動的にソフトウェア事前取り出し命令を挿入しないようにコンパイラーに命令します。 このオプションを使用すると、ユーザーは、事前取り出しという最適化の機能をオフにすることができます。 デフォルトは、-qprefetch です。 |
-qnotrigraph | どの言語レベルを指定しているかに関わらず、3 文字表記を解釈しないようにコンパイラーに命令します。 Linux では、デフォルトは -qtrigraph です。 |
-qsaveopt | ソース・ファイルを対応するオブジェクト・ファイルにコンパイルするコマンド行オプションを 保管するようにコンパイラーに命令します。 このオプションは、コンパイルで .o ファイルが生成されない場合は効果がありません。 デフォルトは、-qnosaveopt です。 |
-qshowpdf | -qpdf1 で指定し、 また最適化レベルが -O 以上 である場合、コンパイラーは追加のプロファイル情報をコンパイル済みアプリケーションに挿入して、 アプリケーション内のすべてのプロシージャーに対する呼び出しおよびブロック数を収集します。 コンパイルされたアプリケーションを実行すると、呼び出しおよびブロック数をファイル ._pdf に記録します。 ._pdf の内容は showpdf ユーティリティーで検索することができます。 デフォルトは、-qnoshowpdf です。 |
-qsourcetype | 入力ファイル名の解釈を制御します。デフォルトの振る舞いは、 ソース・ファイルのプログラミング言語がそのファイル名のサフィックスによって示すものです。 デフォルトは、-qsourcetype です。 |
-qutf | ユニコード・エンコード形式に 16 ビットおよび 32 ビットのストリング・リテラルを提供する UTF リテラル構文の認識を使用可能にします。 |
-qflttrap=nanq | NaNQ (Not a Number Quiet) をキャッチするために、コードに追加の命令を生成するようにコンパイラーに命令します。 このオプションは、有効な演算によって作成されたものを含む、浮動小数点命令によって処理または生成された、 すべての NaNQ を検出することを目的としています。 |
-qhot=simd | コンパイラーに自動 SIMD ベクトル化を試行するように命令します。デフォルトは、-qhot=nosimd です。 |
-qipa=infrequentlabel | 標準的なプログラム実行中にまれに呼び出されることがあるラベルのリストを指定します。 これらのラベルの呼び出しで最適化を行う対象を限定することによって、 コンパイラーでプログラムのその他の部分をより高速に処理できる場合があります。このオプションは、 ユーザー定義のラベルにのみ適用されます。 |