ベクトル化のプログラミングにおけるガイドライン

ベクトル化コンパイラーの目的は、自動的に SIMD (single-instruction multiple data) 処理を活用することです。コンパイラーに (宣言子などを使用して) 追加情報を提供することで、コンパイラーのベクトル化を助けます。

ガイドライン

ループに変更が必要な場合がよくあります。ループ本体のガイドラインに従ってください。

好ましいもの

避けるべきもの

ベクトル化可能なコードに変えるには、ループを変更しなければならない場合がよくあります。ただし、変更する部分は、ベクトル化に最小限必要な箇所だけにし、他の部分まで変更しないようにしてください。特に、次の項目に注意してください。

制約事項

次の制約事項に注意してください。ベクトル化は、ハードウェアとソースコードのスタイルという 2 つの主な要因により制約されます。

要因

説明

ハードウェア

コンパイラーは、それを動かすハードウェアからいくつか制約を受けます。ストリーミング SIMD 拡張命令を実行する場合、ベクトルメモリー演算は、16 バイトでアライメントしたメモリー参照が優先するため、アクセスストライドが 1 に制限されます。つまり、コンパイラーは、たとえループをベクトル化可能と抽象的に認識しても、別のターゲット・アーキテクチャーに対してはベクトル化をしないかもしれません。

ソースコードのスタイル

ソースコードの書き方によっては最適化の妨げになるときもあります。例えば、グローバルポインターを使用する場合に、2 つのメモリー参照が別々の場所で行われるかどうかをコンパイラーが判別できないという問題がよく起こります。このような場合、一部の変換処理は順序の並べ替えができなくなります。

コンパイラーによる自動ベクトル化を阻害する多くの要因はループ構造の書き方にあります。ループ本体にはキーワード、演算子、データ参照、およびメモリー演算が含まれており、それらが互いに作用し合うためにループの動作がよく見えなくなります。

しかし、これらの制約を理解し、診断メッセージの読み方を知れば、そうした既知の制約条件を克服して効率良くベクトル化できるようプログラムを修正できます。以降の各セクションでは、ループ構造についてベクトライザーの機能と制約条件を簡単に述べます。