DECLARE SIMD

目的

DECLARE SIMD ディレクティブは、SIMD ループ内で呼び出される 1 つ以上のバージョンを作成するために、関数またはサブルーチンに適用されます。

必須オプション

-qsmp

構文

構文図を読む構文図をスキップする
                                    .-+---+-------------------.   
                                    | '-,-'                   |   
                                    V                         |   
>>-DECLARE SIMD--+---------------+----+---------------------+-+-><
                 |           (1) |    '-declare_simd_clause-'     
                 '-proc_name-----'                                

注:
  1. 「使用法」セクションを参照してください。

declare_simd_clause は以下のとおりです。

構文図を読む構文図をスキップする
>>-+-aligned_clause-----+--------------------------------------><
   +-inbranch_clause----+   
   +-notinbranch_clause-+   
   +-linear_clause------+   
   +-simdlen_clause-----+   
   '-uniform_clause-----'   

aligned_clause
list 内の引数が指すオブジェクトが、alignment で表されるバイト数に従ってバイト位置合わせされることを宣言します。 構文は ALIGNED(list[:alignment]) です。 alignment は正定数の整数の式でなければなりません。 1 つのリスト項目を複数の aligned_clause に指定することはできません。
inbranch_clause 1
関数の SIMD バージョンが常に SIMD ループの条件ステートメントの内部から呼び出されることを指定します。 構文は INBRANCH です。
notinbranch_clause 1
関数の SIMD バージョンが SIMD ループの条件ステートメントの内部から呼び出されないことを指定します。 構文は NOTINBRANCH です。
linear_clause 2
これは、list 内のデータ変数が各 SIMD レーンに対して private であること、およびループの反復スペース3 との線形関係を持つことを宣言します。構文は LINEAR(list[:linear-step]) です。linear-step は、ディレクティブの UNIFORM 節で指定された定数整数式または整数パラメーターでなければなりません。
simdlen_clause
任意数の、関数の同時引数 (つまり、各 SIMD チャンクに要求される反復数) を指定します。 DECLARE SIMD ディレクティブで作成された関数の SIMD バージョンの同時引数の数は、実装で定義されます。 構文は SIMDLEN(length) です。 length は正定数の整数の式でなければなりません。
DECLARE SIMD ディレクティブで指定できる SIMDLEN 節は最大で 1 つです。
uniform_clause 2
単一 SIMD ループ実行中に、関数のすべての同時呼び出しのインバリアント値を設定するために、list に各引数を宣言します。 構文は UNIFORM(list) です。
注:
  1. inbranch_clausenotinbranch_clause の両方を指定することはできません。
  2. 最大で uniform_clause または linear_clause のいずれか 1 つの list に引数を指定できます。
  3. 「SIMD」トピックの注 2 を参照してください。

使用法

DECLARE SIMD ディレクティブは宣言ディレクティブです。 関数またはサブルーチンでは複数の DECLARE SIMD ディレクティブを使用できます。

DECLARE SIMD ディレクティブはいずれも、以下のいずれかの場所で使用する必要があります。
  • SIMD バージョンの作成が有効になっているサブルーチン・サブプログラムまたは関数サブプログラムの仕様部分。 proc_name を省略した場合は、これが唯一の有効な場所です。
  • 適用対象のインターフェース本体。

規則

関数またはサブルーチンの本体は構造化ブロックでなければなりません。

関数またはサブルーチンへ、またはそれらから分岐するプログラムは規格適合外です。

関数またはサブルーチンの実行では、SIMD チャンクの同時反復の実行を変更するような副次作用があってはなりません。

関数またはサブルーチンが SIMD ループから呼び出される場合、関数またはサブルーチンの実行によって OpenMP 構文 (simd 節のある ordered 構文を除く) が実行されてはなりません。

例 1

次の例では、min 関数の DECLARE SIMD ディレクティブが関数の SIMD バージョンを作成します。 min 関数の SIMD バージョンは、複数の引数を同時に処理します。 DECLARE SIMD ディレクティブで作成された関数の SIMD バージョンの同時引数の数は、実装で定義されます。

FUNCTION findmin (a, b, c)
INTEGER :: a(N), b(N), c(N)
!$OMP SIMD
  DO i=1; N; 1
  c(i) = min(a(i), b(i))
!$OMP END SIMD
!$OMP DECLARE SIMD
  FUNCTION min (a, b) RESULT(c)
  INTEGER :: a, b, c
  IF (a < b) THEN
    c = a
    ELSE
    c = b
  END IF
  END FUNCTION
END FUNCTION
例 2
次の例では、$OMP DECLARE SIMD SIMDLEN(4) ディレクティブにより、min 関数の SIMD バージョンが 4 つの引数を同時に処理すること、つまり 4 つの反復が各 SIMD チャンクに必要であることを指定します。
FUNCTION findmin (a, b, c)
INTEGER :: a(N), b(N), c(N)
!$OMP SIMD
  DO i=1; N; 1
  c(i) = min(a(i), b(i))
!$OMP END SIMD
!$OMP DECLARE SIMD SIMDLEN(4)
  FUNCTION min (a, b) RESULT(c)
  INTEGER :: a, b, c
  IF (a < b) THEN
    c = a
    ELSE
    c = b
  END IF
  END FUNCTION
END FUNCTION