OpenMP和嵌套for循环以及continue语句

OpenMP和嵌套for循环以及continue语句,c,openmp,C,Openmp,我有以下代码: int myArray[] = {0, 0, 0, 0, 0, 0}; double EV = 0; for(short a1 = 1; a1 <= 6; ++a1) { ++myArray[a1-1]; if(....) { --myArray[a1-1]; continue; } EV = myEVFunc(); if(EV...) { for(short a2 =

我有以下代码:

int myArray[] = {0, 0, 0, 0, 0, 0};
double EV = 0;
for(short a1 = 1; a1 <= 6; ++a1)
{
    ++myArray[a1-1];
    if(....)
    {
        --myArray[a1-1];
        continue;
    }
    EV = myEVFunc();
    if(EV...)
    {

        for(short a2 = 1; a2 <=6 ; ++a2)
        {
            ++myArray[a2-1];
            if(....)
            {
                --myArray[a2-1];
                continue;
            }
            EV = myEVFunc();
            if(EV...)
            {
                for(short a3 = 1; a3 <= 6; ++a3)
                {
                    ++myArray[a3-1];
                    if(....)
                    {
                        --myArray[a3-1];
                        continue;
                    }
                    EV = myEVFunc();
                }
            }
        }
    }
}
intmyarray[]={0,0,0,0,0};
双EV=0;

对于(简言之,a1=1;a1我将指出两件显而易见的事情:

1.
double EV=0在外部循环之外声明。因此,它将被所有线程共享。因此,在
EV=myEVFunc()处将有一个竞争条件和每次访问
EV

解决方法是在循环中声明它。这将使它对每个线程都是私有的

#pragma omp parallel for
    for(short a1 = 1; a1 <= 6; ++a1)
    {
        ++myArray[a1-1];
        if(....)
        {
            --myArray[a1-1];
            continue;
        }
        double EV = myEVFunc();
        if(EV...)
        ...
#pragma omp parallel for

对于(短a1=1;a1,如果您需要的更多,您还可以使用线程私有

它将为每个线程提供变量EV的私有副本。最初,除非您也使用copyin,否则它将在这些线程中取消初始化

如果指令中没有COPYOUT,则如下所示:

#pragma omp parallel for private(EV) 

这避免了竞争条件,并允许EV在每个线程中独立运行

您还具有阵列访问的竞争条件,例如
++myArray[a1-1];
和来自不同线程的
++myArray[a2-1];
。 另外,您需要声明所有循环计数器私有,
a1
(由于pragma omp for而默认为私有,
a2、a3

也许您可以找到另一种编写循环的方法,因为循环中的所有这些条件语句通常都不是很有效。

您可以使用“#pragma omp atomic”来编写++和--语句。