プログラミングの基本となるガイドライン

ベクトル化コンパイラの目標は、自動的にSIMD (single-instruction multiple data) 処理を活用することです。次に示したガイドラインと制約条件をよく確認し、コンパイラが最適なベクトル化を行うのを阻害する曖昧な部分を除去するために、あなたのコードと先の項に示すコードの具体例を照合してください。

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

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

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

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

制約事項

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

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

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

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