ループを引数キーワードに従ってベクトル化するようにコンパイラーに指示します。
#pragma vector {always[assert]|dynamic_align|nodynamic_align|temporal|nontemporal|[no]vecremainder|vectorlength(n1[, n2]...)} |
#pragma vector nontemporal[(var1[, var2, ...])] |
always |
ベクトル化するかどうかを決定する際、効率ヒューリスティックを無効にするようにコンパイラーに指示します。非ユニットストライドまたはほとんどアライメントの合っていないメモリーアクセスをベクトル化して、プログラムで後に続くループのベクトル化を制御します。オプションで assert キーワードを指定できます。 |
dynamic_align |
ループに対して動的にアライメントの最適化を行うようにコンパイラーに指示します。 |
nodynamic_align |
ループに対する動的なアライメントの最適化を無効にします。 |
nontemporal |
特に明記されていない限り、サポートされているすべてのアーキテクチャー・ベースのシステムで、一時的ではない (ストリーミング) ストアを使用するようにコンパイラーに指示します。オプションでカンマ区切りの変数リストも指定できます。 このプラグマを指定する場合、単一または複数のスレッド内で正しいメモリーの順序設定が徹底されるように、必要なフェンスを挿入する必要があります。この 1 つの典型的な方法として、コンパイラーがストリーミング・ストア命令を挿入する可能性がある、ループ (例えば、初期化ループ) の直後に _mm_sfence 組込み関数呼び出しを挿入します。 |
temporal |
特に明記されていない限り、サポートされているすべてのアーキテクチャー・ベースのシステムで、一時的な (非ストリーミング) ストアを使用するようにコンパイラーに指示します。 |
vecremainder |
オリジナルのループがベクトル化された場合にリマインダー・ループをベクトル化するようにコンパイラーに指示します。 |
novecremainder |
オリジナルのループがベクトル化された場合にリマインダー・ループをベクトル化しないようにコンパイラーに指示します。 |
vectorlength (n1[, n2]...) |
メイン・ベクトル・ループの生成時に使用するベクトル長/係数をベクトル化機能に指示します。 |
vector プラグマは、ループのベクトル化が可能である限り、ベクトル化によるメリットの有無に関する通常のヒューリスティックな判断を無視してベクトル化を行うように指示します。vector プラグマは、引数キーワードを使用して必要なループのベクトル化の種類を指定します。コンパイラーは入れ子構造のループに vector プラグマを適用しないため、入れ子にされたそれぞれのループの前に、プラグマ文が必要です。loop 制御文の前にプラグマを配置してください。
always キーワードの使用
always 引数キーワードが使用されると、プラグマは後に続くループのベクトル化を制御します。assert を指定すると、コンパイラーはエラーレベルのアサーション・テストを生成し、コンパイラーの効率ヒューリスティックによってループのベクトル化が不可能であることが示す旨のメッセージを表示します。
dynamic_align/nodynamic_align キーワードの使用
動的なアライメントは、ループ内のメモリー参照のアライメントを改善するためコンパイラーが実行可能な最適化です。ベクトルループが特定のメモリー境界でアライメントされるように、ベクトルループの反復をピールして、ベクトルループの前のスカラーループ (これもベクトル化される可能性があります) に配置します。dynamic_align を指定すると最適化の実行が有効になりますが、コンパイラーは効率ヒューリスティックを使用してループに最適化を適用するかどうかを判断します。nodynamic_align を指定すると、最適化は無効になります。デフォルトでは、コンパイラーは最適化を行いません。
nontemporal/temporal キーワードの使用
nontemporal と temporal 引数キーワードは、IA-32 およびインテル® 64 アーキテクチャー・ベースのシステムで、レジスター内容のストア方法 (ストリーミングか非ストリーミング) を制御します。
デフォルトでは、コンパイラーはそれぞれの変数にストリーミング・ストアを使用するかどうかを自動で決定します。
ストリーミング・ストアは、特定のプロセッサーにおいて非ストリーミング・ストアよりも、大幅なパフォーマンスの向上をもたらす可能性があります。ただし、ストリーミング・ストアの使用を誤ると、パフォーマンスが大幅に低下します。
[no]vecremainder キーワードの使用
vecremainder キーワードを指定すると、コンパイラーはメインループがベクトル化された場合にリマインダー・ループをベクトル化しようとします。always キーワードを指定しても、リマインダー・ループのベクトル化はコンパイラーの効率ヒューリスティックの対象になります。
novecremainder キーワードを指定すると、コンパイラーはメインループはベクトル化しますが、リマインダー・ループはベクトル化しません。
vectorlength キーワードの使用
n は 2 の累乗の整数値で、2、4、8、または 64 でなければなりません。複数の値を指定すると、ベクトル化機能は、コストモデルの決定に基づき、指定されたベクトル長の中から 1 つを選択します。
vector プラグマは注意して使用してください。
コンパイラーの効率性ヒューリスティックの変更は、ベクトル化によりパフォーマンスが向上することが確実である場合にのみ行います。