コンパイラーがデータの依存関係を判断できない場合、スカラーコードが生成されます。コンパイラーの解析が非常に複雑になった場合も、ベクトル化されずスカラーコードが生成されます。ベクトル化を向上する最も一般的な手法は、プラグマまたはディレクティブの追加です。コード単独で識別できるよりも詳細なコードセグメントに関する情報をコンパイラーに提供して、コンパイラーがより多くの最適化を行えるようにします。ループをベクトル化しても安全かどうか判断できないポインターの一義化です。ループに入るデータがオーバーラップしないことが分かっている場合は、プラグマまたはディレクティブを追加して、可能性のある依存関係を無視してベクトル化するようにコンパイラーに指示できます。異なるコンパイラー開発元により、さまざまなプラグマ/ディレクティブが実装されました。データ依存の可能性を無視するようにコンパイラーに知らせることは非常に一般的であるため、ソフトウェア開発者にとっては、各コンパイラー独自のプラグマを利用するのではなく、すべてのコンパイラーで認識できるプラグマやディレクティブを利用するほうが便利です。コンパイラー・プラグマ/ディレクティブを追加することにより、その隙間を埋めました。標準化されたプラグマ/ディレクティブを使用すると、多くのコンパイラーでそのまま利用できます。このプラグマ/ディレクティブの構文は次のとおりです。プラグマの追加オプションがあります。これらの追加パラメーターは、コードに次のような反復が含まれる場合に役立ちます。.}これらの反復間には依存関係があります。安全にベクトル化することができます。この場合、次のようにオプション・パラメーター使用します。プラグマ/ディレクティブを使用すると、プログラムおよびデータアクセスを十分に理解し、依存性がないと仮定しても安全であるとコンパイラーに知らせていることになります。この仮定が間違っていると、正しい結果は得られません。ありますが、結果が正しいことは保証されません。ループの順序を逆にして値が変わる場合、コードを変更しないでベクトル化やスレッド化を行うことは安全ではありません。アトミック操作のような追加のオプション、あるいはほかの実行制御が必要になります。結果が正しい場合、そのデータセットでは演算の順序は問題ではありません。異なるデータセットでは演算の順序が問題になる可能性があります。そのため、チェックに失敗した場合に依存関係があることは明白ですが、チェックをパスしても安全性は保証されません。ツールは、より正確な解析を提供し、依存関係を特定できるように支援します。プラグマやディレクティブを適用するヒントを示します。関数ループ内の頻繁な関数/サブルーチン呼び出しはベクトル化を妨げます。この問題の解決策はいくつかあります。ショート関数はベクトル化可能な関数として記述できます。多くの超越関数のベクトルバージョンは、コンパイラーとともに提供される数学ライブラリーに含まれています。適切な構文を使用すると、コンパイラーはユーザーが記述した関数のベクトルバージョンとスカラーバージョンの両方を生成します。乗して、値に定数を加える関数を記述してみましょう。関数は次のようになります。}この関数のベクトルバージョンとスカラーバージョンを生成するようにコンパイラーに伝えるには、次のように記述します。}次に、関数を呼び出している場所でも、次のように記述してループをベクトル化するようにコンパイラーに指示します。次のディレクティブを使用します。上記の関数のベクトル化可能な実装を生成するには、次のように記述します。sqadd関数を呼び出すファイルで、次のように定義します。ループをベクトル化します。対応であることを認識して、ベクトル化されたコードを生成します。文が記述されていると、条件付きのためベクトル化が妨げられることがあります。この場合は、ベクトル化できるようにコードを変更します。}次のように変更します。海洋コードに適用されたものです。コードは、地球の海洋システムをシミュレートして、数か月から数千年のタイムスケールで表示します。未満の地域および大循環を扱います。コプロセッサーにおけるこのルーチンのベクトル強度を測定しました。コンパイラー・レポートに基づいて、ベクトル強度が低いデータのコードとレポートの内容を調べました。コードの一部を次に示します。ループ内には、サブルーチン呼び出しと不変条件の両方が含まれていたため、サブルーチンをベクトル化可能にして、ループと条件の位置を変更しました。新しいコードは次のようになります。組み合わせて、コードをベクトル化し、パフォーマンスを向上しました。通常、コードをチューニングするには、複数の手法を適用する必要があります。つのステップにすぎません。場合によっては、データレイアウトの変更、プラグマやディレクティブの追加、データのアライメントなど、すべての変更が行われるまでパフォーマンスが向上しないこともあります。ほかの手法については、この後のセクションで説明します。ループの中で計算されます。この処理は、中間値をいくつかの計算で使用するために行われます。計算の共通のサブセットは、計算後、再利用するためにしばらく保持されます。コードを読みやすくする目的で行われることもあります。レジスターと同じ長さのショートベクトルにすることを意味します。この手法は、心臓細胞のカルシウム動態に関する偏微分方程式系を解く有限要素法および有限体積法に適用されました。カルシウムイオンは、心臓の鼓動を規則的に繰り返す重要な役割を果たしています。して知られる、細胞の個別の位置の格子で心臓細胞に放出されます。カルシウム濃度に依存します。カルシウムを放出すると、カルシウム依存の局所濃度は急激に増加し、拡散するカルシウムが隣接するサイトで放出される可能性が高くなります。シーケンスが細胞でカルシウムの放出を開始するとともに、放出は濃度上昇のウェーブに自己組織化されます。引き金となるウェーブは、不整脈や生死にかかわる心室細動を引き起こすことがあります。つの時間依存の偏微分方程式系によりシミュレートされます。リニアソルバーを使用して偏微分方程式系を解いています。ようなプロファイラーを使用すると、実行時間のほとんどが行列ベクトル乗算関数で費やされていることが分かりました。なるように拡張されます。表現が使用されています。一時配列が使用されると、新しいコードは次のようになります。