OpenMP* COPYIN 節による初期化されていない変数からのコピー

COPYIN 節で指定された変数はこの並列領域で代入されていません。

COPYIN 節は、threadprivate 変数のマスター・スレッド・コピーの値を、並列領域を実行しようとしているチーム内のほかのスレッドのプライベート・コピーにコピーします。この診断は、マスター・スレッド・コピーが別の並列領域外で代入されていない場合に出力されます。

以前に、別の並列領域内で THREADPRIVATE 変数への代入が行われている場合、プログラムはエラーとなる可能性があります。これは、以前の並列領域内の代入が異なるスレッドで行われている可能性があり、そのためにマスター・スレッド・コピーの値が予測できないためです。これにより、並列モードとシーケンシャル・モードで異なる動作がもたらされることがあります。

ID

問題箇所

説明

1

初期化されていない読み取り

COPYIN 節の場所


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

int a[1000];
#pragma omp threadprivate (a)

int sum;

void fgood()
{
    int i;
    int b[1000];

    for (i = 0; i < 1000; i++) {
        b[i] = i;
    }

    for (i = 10; i < 1000; i++) {
        a[i] = b[i] + 1;
    }
}

void fbad()
{
    int i;
    int b[1000];

    for (i = 0; i < 1000; i++) {
        b[i] = i;
    }

#pragma omp parallel for
    for (i = 10; i < 1000; i++) {
        a[i] = b[i] + 1;
    }
}

void mycopyin()
{
    int i;
    // a is not properly initialized
    // if fbad was called earlier
#pragma omp parallel for reduction (+:sum) copyin(a)
    for (i = 10; i < 1000; i++) {
        sum = sum + a[i];
    }
}

int main(int argc, char **argc)
{
    int i;

    sum = 0;
    if (argc < 10)
        fgood();
    else
        fbad();

    mycopyin();

    printf("%d\n", sum);
    return 0;
}
        

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