ソフトウェアのパイプライン化を行うまたは行わないようにループの優先度を示します。
#pragma swp #pragma noswp |
なし
swp プラグマは、ソフトウェアのパイプライン化が行われるループの優先度を示します。プラグマは、データ依存性を使用しません。しかし、プロファイル・カウントまたは等しくない制御フローに基づくヒューリスティックを上書きします。
swp プラグマで起動されるソフトウェアのパイプライン化の最適化は、最内ループをスケジューリングする命令を適用します。また、ループ内で命令が異なるステージに分割され、増大した命令レベルの並列処理を許可します。
この手法は、長い待ち時間の演算による影響を減らすことができます。その結果、ループ実行が速くなります。ソフトウェアのパイプライン化に選択されるループは、インライン化されないプロシージャー呼び出しを含まない、常に最内ループです。最適化は、完全にアンロールされたループを最内ループとしてもはや認識しないため、完全にアンロールするループは、追加のループを最内ループにすることができます。
ループに対しソフトウェアのパイプライン化を行わないようにコンパイラーに指示するには、noswp プラグマを使用します。パイプライン化を行うと prolog および epilog コードシーケンスの実行でオーバーヘッドが発生するような、反復回数の少ないループでは利点があります。
例: swp プラグマの使用
次の例では、プラグマを使用してコンパイラーにソフトウェアのパイプライン化を試すように指示する方法を示します。
void swp(int a[], int b[])
{
#pragma swp
for (int i = 0; i < 100; i++)
if (a[i] == 0)
b[i] = a[i] + 1;
else
b[i] = a[i] * 2;
}