SIMD ループからの一度の呼び出しで、SIMD (single instruction-multiple data) 命令により複数の引数を処理できる関数バージョンを作成します。
構文
#pragma omp declare simd [clause][[,]clause] ...] |
関数定義または宣言。
引数
clause |
clause (節) は次のいずれかです。aligned( list[:linear-step] )
inbranch
simdlen( length )
linear( list[:linear-step] )
notinbranch
reduction( operator:list )
uniform( argument-list )
|
説明
declare_simd 構造は、特定の関数の SIMD バージョンを作成します。この SIMD バージョンを使用して、1 つの SIMD ループから一度の呼び出しで複数の変数を同時に処理できます。
関数には、SIMD チャンクの並列反復実行を変更するような副作用があってはなりません。SIMD ループから呼び出される場合、関数は OpenMP* 構造を実行することはできません。
例
次の例は、min 関数の SIMD 命令を使用して実行するバージョンを生成する方法を示します。
#pragma omp declare simd notinbranch
float min (float a, float b) {
Return a < b ? a : b;
}
void minner (float *a, float *b, float *c)
{
#pragma omp parallel for simd
for (i=0; i<N; i++)
c[i] = min(a[i], b[i], c[i]);
}