FORALL 構文

+---------------------------------Fortran 95---------------------------------+

FORALL 構文は、サブオブジェクトのグループへの割り当て、 特に配列エレメントへの割り当てを実行します。

WHERE 構文とは異なり、FORALL は、配列エレメント、 配列セクションおよびサブストリングの割り当てを実行します。 また、FORALL 構文の中の それぞれの割り当ては、直前の割り当てと整合していなくても構いません。 FORALL 構文には、 ネストされた FORALL ステートメント、FORALL 構文、WHERE ステートメントおよび WHERE 構文を含むことができます。

+-----------------------------End of Fortran 95------------------------------+

+----------------------------------IBM 拡張----------------------------------+

INDEPENDENT ディレクティブは、FORALL ステートメント または構文の各演算をどの順序で行ってもプログラムのセマンティクスに 影響しないですむようにします。 INDEPENDENT ディレクティブの詳細については、INDEPENDENTを参照してください。

+------------------------------End of IBM 拡張-------------------------------+

+---------------------------------Fortran 95---------------------------------+



>>-FORALL_construct_statement----------------------------------><
 
 
>>-forall_body-------------------------------------------------><
 
 
>>-END_FORALL_statement----------------------------------------><
 
 

FORALL_construct_statement
構文の詳細については、FORALL (構文)を参照してください。

END_FORALL_statement
構文の詳細については、END (構文)を参照してください。

forall_body
次のステートメントまたは構造体の 1 つ以上です。

forall_assignment
WHERE ステートメント (WHEREを参照)
WHERE 構文 (WHERE 構文を参照)
FORALL ステートメント (FORALLを参照)
FORALL 構文

forall_assignment
assignment_statement また は pointer_assignment_statement のどちらかです。

forall_body で参照されるプロシージャーはすべて (定義済み 操作または定義済み割り当てによって参照されるものを含む)、純粋でなければなりません。

FORALL ステートメントまたは構文が、FORALL 構文の 中でネストされている場合、内側の FORALL ステートメント または構文は、外側の FORALL 構文で使用されている どの index_name も再定義することはできません。

同じステートメントの中で、複数回、アトミック・オブジェクトを割り当てたり、 関連付け状況を変更したりすることはできませんが、 同じ FORALL 構文の中にある別の割り当てステートメントは、 アトミック・オブジェクトを再定義したり再び関連させたりすることができます。 また、WHERE 構文の中のそれぞれの WHERE ステートメント および割り当てステートメントは、次の制約事項を守らなければなりません。

FORALL_construct_name を指定する場合、FORALL ステートメント および END FORALL ステートメントの両方で指定しなければなりません。 END FORALL ステートメントまたは FORALL 構文の 中のどのステートメントも、分岐ターゲット・ステートメントにできません。

+-----------------------------End of Fortran 95------------------------------+

+---------------------------------Fortran 95---------------------------------+

FORALL 構文の解釈

  1. FORALL 構文ステートメントの中の 各 forall_triplet_specsubscript および stride 式は、 順序に関係なく評価されます。 可能な index_name 値のすべてのペアが、組み合わせの集合を形成します。 たとえば、次のようなステートメントを想定します。

    FORALL (I=1:3,J=4:5)
    

    I および J の組み合わせの集合は次のとおりです。

        {(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)}
    

    -1 および -qnozerosize コンパイラー・オプションは、 このステップに影響を与えません。

  2. 組み合わせの集合の scalar_mask_expr は順序に 関係なく評価され (FORALL 構文 ステートメントにある)、アクティブな組み合わせの集合が 作成されます (.TRUE. と評価されたもの)。たとえば、マスク (I+J.NE.6) が上記の集合に適用された場合、 アクティブな組み合わせの集合は次のようになります。

        {(1,4),(2,5),(3,4),(3,5)}
    
  3. 出現順で、それぞれの forall_body ステートメント または forall_body 構文を実行します。 アクティブな組み合わせの集合に対して、それぞれのステートメントまたは構文は、 次のように完全に実行されます。

    assignment_statement

    すべてのアクティブな index_name 値の 組み合わせについて、順序に関係なく、 右側の expression のすべての値、および左側の variable の すべての添え字、ストライド、およびサブストリング境界を評価します。

    すべてのアクティブな index_name 値の組み合わせについて、 順序に関係なく、計算された expression の値を 対応する variable エンティティーに割り当てます。

    INTEGER, DIMENSION(50) :: A,B,C
    INTEGER :: X,I=2,J=49
    FORALL (X=I:J)
      A(X)=B(X)+C(X)
      C(X)=B(X)-A(X) ! All these assignments are performed after the
                     ! assignments in the preceding statement
    END FORALL
    END
    

    pointer_assignment_statement

    何がポインター割り当てのターゲットになるのかを順序に関係なく評価し、 すべてのアクティブな index_name 値の 組み合わせについて、ポインターのすべての添え字、ストライド、 およびサブストリング境界を評価します。 ターゲットがポインターではない場合、ターゲットの 判別には、その値の評価は含まれません。 ポインター割り当ては、右側の値を判別する必要はありません。

    すべてのアクティブな index_name 値の組み合わせに対して、 順序に関係なく、すべてのターゲットを、 対応するポインター・エンティティーに関連させます。

    WHERE ステートメントまたは構文

    WHERE ステートメント、WHERE 構文ステートメント、 ELSEWHERE ステートメント、 またはマスクされた ELSEWHERE ステートメント (それぞれ アクティブな index_name 値の組み合わせ) ごとに、 順序に関係なく、制御マスクおよび保留制御マスクを評価し、 そのステートメントにとってよりよいアクティブな組み合わせを作ります。 これについては マスクされた配列割り当ての解釈で説明しています。それぞれのアクティブな組み合わせに対し、 コンパイラーは WHERE ステートメント、WHERE 構文ステートメント、 またはマスクされた ELSEWHERE ステートメントの割り当てを実行し、 そのアクティブな組み合わせで真である制御マスクの値を割り当てます。 前に説明したとおり、コンパイラーは、WHERE 構文内の それぞれのステートメントを順に実行します。

    INTEGER I(100,10), J(100), X
    FORALL (X=1:100, J(X)>0)
      WHERE (I(X,:)<0)
        I(X,:)=0  ! Assigns 0 to an element of I along row X
                  ! only if element value is less than 0 and value
                  ! of element in corresponding column of J is
      ELSEWHERE   ! greater than 0.
        I(X,:)=1
      END WHERE
    END FORALL
    END
    

    FORALL ステートメントまたは構文

    外側の FORALL ステートメントまたは構文にあるアクティブな 組み合わせについて、順序に関係なく、forall_triplet_spec_list の中 の subscript 式および stride 式を評価します。 有効な組み合わせは、内側と外側の FORALL 構文の組み合わせの集合のカルテシアン積です。 scalar_mask_expr は、内側の FORALL 構文のアクティブな組み合わせを判別します。 これらのアクティブな組み合わせについて、ステートメントと構造体が実行されます。

    ! Same as FORALL (I=1:100,J=1:100,I.NE.J) A(I,J)=A(J,I)
     
    INTEGER A(100,100)
    OUTER: FORALL (I=1:100)
      INNER: FORALL (J=1:100,I.NE.J)
        A(I,J)=A(J,I)
      END FORALL INNER
    END FORALL OUTER
    END
    

+-----------------------------End of Fortran 95------------------------------+

IBM Copyright 2003