ポインター一義化によりパフォーマンスを向上する

2 つのポインターが同じメモリーの場所を指す場合、両方のエイリアスが作成されます。エイリアスされる可能性のあるポインターを使用してメモリーへ格納すると、一部の最適化を妨げることがあります。例えば、ベクトル化の安全が確保されないループ反復間の依存性が作成される場合があります。コンパイラーは、ループのベクトル化されたバージョンとベクトル化されていないバージョンの両方を生成し、ランタイム時にテストして最適なコードパスを選択することがあります。ポインターがエイリアスしない場合、それをコンパイラーに知らせると、ランタイム時のチェックは回避され、ベクトル化された単一のコードパスが生成されます。Multiply.c では、コンパイラーは関数 matvec(FTYPE a[][COLWIDTH], FTYPE b[], FTYPE x[]) のポインター ba または x にエイリアスされるかどうかを判断するためにランタイムチェックを生成します。Multiply.c が NOALIAS マクロでコンパイルされると、引数 b の restrict 修飾子は、ポインターがほかのポインターにエイリアスされないこと、特に配列 ba または x とオーバーラップしないことをコンパイラーに知らせます。

Note icon

restrict 修飾子は、.c または .cpp ファイルでは /Qrestrict コンパイラー・オプション、.c ファイルでは /Qstd=c99 コンパイラー・オプションを使用して指定する必要があります。

NOFUNCCALL プリプロセッサー定義NOALIAS に置き換えます。

この条件付きコンパイルは、メインプログラムのループを関数呼び出しに置き換えます。プロジェクトをリビルドし、実行ファイルを開始して、出力結果で表示される実行時間を記録してください。

Multiply.c(45) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Multiply.c(55) (列 3): リマーク: ループがベクトル化されました。
Driver.c(140) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Driver.c(140) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(141) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(164) (列 2): リマーク: ループがベクトル化されました。
Driver.c(145) (列 2): リマーク: ループはベクトル化されませんでした: 非標準のループはベクトル化候補ではありません。
Driver.c(81) (列 2): リマーク: ループがベクトル化されました。
Driver.c(69) (列 2): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。
Driver.c(54) (列 2): リマーク: ループはベクトル化されませんでした: 内部ループではありません。
Driver.c(55) (列 3): リマーク: ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です。

配列がオーバーラップしないことをコンパイラーに知らせたため、コンパイラーはループを安全にベクトル化できることを認識します。

戻る: ベクトル化レポートを生成する 次へ: データのアライメントによりパフォーマンスを向上する


このヘルプについてのフィードバックを送信

© 2010 Intel Corporation. 無断での引用、転載を禁じます。