ベクトル化プログラミングの基本となるガイドライン

ベクトル化コンパイラの目標は、自動的にSIMD (single-instruction multiple data) 処理を活用することです。次に示したガイドラインと制約条件をよく確認し、先の項に示すコードの具体例を見て、それらに照らしてコードの良否を判断し、最適なベクトル化を阻害する曖昧な部分が見つかったらそれを直してください。

ループ本体に関するガイドライン:

ループ本体内では避けたほうがよいもの:

ベクトル化できるコードにする方法

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

制約事項

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

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

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

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