パフォーマンスおよび最適化

多数の新機能と機能拡張は、 最適化とパフォーマンス・チューニングのカテゴリーに分類されます。

アーキテクチャーおよびプロセッサー固有のコードのチューニング

-qarch コンパイラー・オプションは、指定されたマシン・アーキテクチャー用に生成される特定の命令を制御します。 -qtune コンパイラー・オプションは、命令、 スケジューリング、および他の最適化を調整して、 指定されたハードウェアでのパフォーマンスを向上させます。 これらのオプションは一緒に働いて、 指定されたアーキテクチャーに最適なパフォーマンスを与えるアプリケーション・コードを生成します。

XL C/C++ V8.0 は、VMX 命令セットをサポートするプロセッサーおよび新しく使用可能になった POWER5+ プロセッサーをサポートする -qarch コンパイラー・オプションで使用可能なサブオプションのリストを増加させます。 以下の新規の -qarch オプションが使用可能です。

高性能ライブラリー

XL C/C++ には、 数学集中アプリケーションのパフォーマンスを大幅に向上させることができる高度に調整された数学関数が組み込まれています。 これらの関数は、以下の高性能ライブラリーを通じて提供されます。

Mathematical Acceleration Subsystem (MASS)
MASS ライブラリーは、共通の数学的計算を実行するために、 高性能のスカラーおよびベクトル関数を提供しています。 XL C/C++ Advanced Edition V8.0 for Linux で組み込まれている MASS ライブラリーは、 新規のスカラーおよびベクトルの関数、および POWER5 プロセッサー・アーキテクチャーの新規のサポートを導入しています。

MASS ライブラリーの使用に関する詳細については、 『Mathematical Acceleration Subsystem の使用』を参照してください。

Basic Linear Algebra Subprograms (BLAS)
XL C/C++ Advanced Edition V8.0 for Linux は、高性能代数関数の BLAS セットを導入しています。 これらの関数を使用して、以下のことを行うことができます。

BLAS 関数の使用に関する詳細については、『Basic Linear Algebra Subprogram の使用』を参照してください。

他のパフォーマンス関連コンパイラー・オプションおよびディレクティブ

次の表の項目は、 前掲のセクションではまだ言及されていない新規または変更されたコンパイラー・オプションおよびディレクティブを説明しています。

ここで提示されている情報は、単なる簡単な概要です。 これらのコンパイラー・オプションに関する詳細については、『パフォーマンス最適化オプション』 を参照してください。

表 2. 他のパフォーマンス関連コンパイラー・オプションおよびディレクティブ
オプション/ディレクティブ 説明
-qfloat -qfloat は、 以下のサブオプションを追加しています。
-qfloat=relax
このサブオプションは、より大きい速度との交換で、 一般的には右側のゼロに関係する加算および減算といった平凡な浮動小数点算術演算を除去することによって、 厳密な IEEE への準拠を緩めます。
-qfloat=norelax
これはデフォルトです。 厳密な IEEE への準拠が保たれます。
-qipa -qipa は、 以下のサブオプションを追加しています。
-qipa=clonearch=arch{,arch}
同じ命令セットの複数のバージョンが作成される 1 つ以上のプロセッサー・アーキテクチャーを指定します。

XL C/C++ は、 命令セットが生成されることになる複数の特定のプロセッサー・アーキテクチャーをユーザーに指定させます。 実行時に、アプリケーションは、稼働環境の特定のアーキテクチャーを検出し、 そのアーキテクチャー用に専門化された命令セットを選択します。

-qipa=cloneproc=name{,name}
clonearch サブオプションによって指定されたプロセッサー・アーキテクチャーについて複製するための 1 つ以上の関数の名前を指定します。
-O -O3 コンパイラー・オプションを指定することは、-qhot=level=0 コンパイラー・オプションの設定も想定するようにコンパイラーに指示するようになりました。

-O4 または -O5 コンパイラー・オプションを指定することは、 -qhot=level=1 コンパイラー・オプションの設定も想定するようにコンパイラーに指示するようになりました。

このリリースでの新規組み込み関数

次の表は、このリリースでの新規の組み込み関数をリストしています。 XL C/C++ が提供する組み込み関数の詳細については、『POWER および PowerPC アーキテクチャーの組み込み関数』を参照してください。

表 3. XL C/C++ 用の組み込み関数
関数 説明
void __builtin_return_address (unsigned int level); 現行の関数の、あるいはその 1 つの呼び出し元の戻りアドレスを戻します。 ここで、level は、呼び出しスタックをスキャンアップするフレームの数を示す定数リテラルです。
void __builtin_frame_address (unsigned int level); 現行の関数の関数フレームの、またはその 1 つの呼び出し元のアドレスを戻します。 ここで、level は、呼び出しスタックをスキャンアップするフレームの数を示す定数リテラルです。
int __compare_and_swap(volatile int* addr, int* old_val_addr, int new_val); 単一ワード変数の内容を、 保管された古い値と比較するアトミック操作を実行します。
int __compare_and_swaplp(volatile long* addr, long* old_val_addr, long new_val); ダブルワード変数の内容を、 保管された古い値と比較するアトミック操作を実行します。
int __fetch_and_add(volatile int* addr, int val); addr によって指定された単一ワードを、 単一のアトミック操作で val によって指定された量だけ増量します。
long __fetch_and_addlp(volatile long* addr, long val); addr によって指定されたダブルワードを、 単一のアトミック操作で val によって指定された量だけ増量します。
unsigned int __fetch_and_and(volatile unsigned int* addr, unsigned int val); addr によって指定された単一ワード内のビットを、 単一のアトミック操作でその値を入力 val パラメーターと AND することによって、クリアします。
unsigned long __fetch_and_andlp(volatile unsigned long* addr, unsigned long val); addr によって指定されたダブルワード内のビットを、 単一のアトミック操作でその値を入力 val パラメーターと AND することによって、クリアします。
unsigned int __fetch_and_or(volatile unsigned int* addr, unsigned int val); addr によって指定された単一ワード内のビットを、 単一のアトミック操作でその値を入力 val パラメーターと OR することによって、設定します。
unsigned long __fetch_and_orlp(volatile unsigned long* addr, unsigned long val); addr によって指定されたダブルワード内のビットを、 単一のアトミック操作でその値を入力 val パラメーターと OR することによって、設定します。
unsigned int __fetch_and_swap(volatile unsigned int* addr, unsigned int val); addr によって指定された単一ワードを、 単一のアトミック操作で値または入力 val パラメーターに設定して、 メモリー・ロケーションの元の内容を戻します。
double __frim(double val); double 形式の入力 val を取り込み、val を次に低い整数値に丸め、結果を double 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
float __frims(float val); float 形式の入力 val を取り込み、val を次に低い整数値に丸め、結果を float 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
double __frin(double val); double 形式の入力 val を取り込み、val を最も近い整数値に丸め、結果を double 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
float __frins(float val); float 形式の入力 val を取り込み、val を最も近い整数値に丸め、結果を float 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
double __frip(double val); double 形式の入力 val を取り込み、val を次に高い整数値に丸め、結果を double 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
float __frips(float val); float 形式の入力 val を取り込み、val を次に高い整数値に丸め、結果を float 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
double __friz(double val); double 形式の入力 val を取り込み、val をゼロに最も近い次の整数値に丸め、結果を double 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
float __frizs(float val); float 形式の入力 val を取り込み、val をゼロに最も近い次の整数値に丸め、結果を float 形式で戻します。 POWER5+ プロセッサーでのみ有効です。
long __ldarx(volatile long* addr); Load Double Word And Reserve Indexed (ldarx) 命令を生成します。 この命令は、後続の stwcx. 命令と一緒に使用して、 指定されたメモリー・ロケーションに対して読み取り/変更/書き込みをインプリメントすることができます。
int __lwarx(volatile int* addr); Load Word And Reserve Indexed (lwarx) 命令を生成します。 この命令は、後続の stwcx. 命令と一緒に使用して、 指定されたメモリー・ロケーションに対して読み取り/変更/書き込みをインプリメントすることができます。
int __stdcx(volatile long* addr, long val); Store Double Word Conditional Indexed (stdcx.) 命令を生成します。 この命令は、先行の ldarx. 命令と一緒に使用して、 指定されたメモリー・ロケーションに対して読み取り/変更/書き込みをインプリメントすることができます。
int __stwcx(volatile int* addr, int val); Store Word Conditional Indexed (stwcx.) 命令を生成します。 この命令は、先行の lwarx. 命令と一緒に使用して、 指定されたメモリー・ロケーションに対して読み取り/変更/書き込みをインプリメントすることができます。
unsigned long __mftb(); Move From Time Base (mftb) ハードウェア命令を生成します。
unsigned int __mftbu(); Move From Time Base Upper (mftbu) ハードウェア命令を生成します。

関連情報