適切に代入されていない OpenMP* の LASTPRIVATE 変数

LASTPRIVATE 節が SECTIONS 構造に記述されている場合、変数は最後の SECTION で代入されなければなりません。

LASTPRIVATE 節では構造の本体内で変数が PRIVATE として扱われます。構造の出口では、領域の最後の作業単位を実行するスレッドに属している、対応するスレッド・プライベートの変数から外部変数の値が代入されます。SECTIONS 構造の場合、最後の作業単位は最後に現れる SECTION に対応します。

確実に決定性のある動作にするには、任意の SECTION で代入される場合、LASTPRIVATE 変数は最後の SECTION で代入されなければなりません。これは、最後の SECTION を実行するスレッドにより、ほかのどの SECTION が実行されるかが不明なために必要です。このエラーは、この規則に違反していることを示します。

ID

問題箇所

説明

1

メモリー読み取り

変数が読み取られた場所

2

OpenMP* 宣言

SECTIONS 宣言子の場所


#include <stdio.h>
#include <omp.h>

int main(int argc, char **argv)
{
    int ii = 0;
    int jj = 0;

    omp_set_num_threads(3);

    #pragma omp parallel
    #pragma omp sections lastprivate (ii, jj)
    {
        #pragma omp section
        ii = 10;
                
        #pragma omp section
        jj = 2;
    }
    
    // Bad: ii is indeterminate here
    printf("After parallel section ii = %d and jj = %d\n", ii, jj);
    
    return 0;
}
        

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