順序付きループにない OpenMP* ORDERED 宣言子

OpenMP* 並列ループに ORDERED 節がありますが、中に ORDERED 宣言子がありません。

ORDERED 宣言子は、並列で実行された処理結果をシーケンシャルに順序付けるのに使用されます。ORDERED 宣言子を実行する並列ループは、それ自身が ORDERED 節でマークされる必要があります。ORDERED 宣言子は、厳密な順序で実行する領域をマークします。

この診断は、ループが ORDERED 節でマークされているが、そのループにより実行される ORDERED 宣言子がないことを示します。これは、ループの ORDERED 節が不要であることを意味します。ORDERED 節が指定されていないループの実行は高速なため、この使用法は非効率的です。

このエラーは、通常 ORDERED 宣言子が誤って省略されたことを示します。

ID

問題箇所

説明

1

OpenMP* 宣言

必要な ORDERED 節が不足しているループの場所


// Example adapted from A.24.1c from OpenMP* 3.0 Specification
// Copyright (C) 1997-2008 OpenMP Architecture Review Board
#include <stdio>

void work(int k)
{
    // #pragma ordered should be here
    printf(" %d\n", k);
}

void a24(int lb; int ub; int stride)
{
    int i;
    #pragma omp parallel for ordered schedule(dynamic)
    for (i = lb; i < ub; i += stride) {
        work(i);
    }
}

int main(int argc, char **argv)
{
    a24(0, 100, 5);
    return 0;
}
        
次に FORTRAN の同様の例を示します。

! Example adapted from A.24.1f from OpenMP* 3.0 Specification
! Copyright (C) 1997-2008 OpenMP Architecture Review Board
SUBROUTINE WORK(K)
    INTEGER K
! OMP ORDERED SHOULD BE HERE
    WRITE(*,*) k
! OMP END ORDERED SHOULD BE HERE

SUBROUTINE SUBA24(LB, UB, STRIDE)
    INTEGER LB, UB, STRIDE
    INTEGER I

!$OMP PARALLEL DO ORDERED SCHEDULE(DYNAMIC)
    DO I = LB, UB, STRIDE
        CALL WORK(I)
    END DO
!$OMP END PARALLEL DO

END SUBROUTINE SUBA24

PROGRAM A24
    CALL SUBA24(0, 100, 5)
END PROGRAM A24
        

Note icon

この例は、OpenMP* 3.0 仕様からのもので、次のように著作権が保護されています。

© 1997-2008 OpenMP Architecture Review Board.

この資料は、OpenMP Architecture Review Board の著作権と本ドキュメントのタイトルが記載され、OpenMP Architecture Review Board の許諾に基づく転載である旨が明記されている場合に限り、無料で一部または全体を転載できます また、転載は OpenMP Architecture Review Board の許諾に基づいて行われたことを明記する必要があります。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。