繁体   English   中英

OpenMP和带有继续语句的嵌套循环

[英]OpenMP and Nested for loops with continue statements

我有以下代码:

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();
                }
            }
        }
    }
}

我正在尝试使用OpenMP并行化循环。 当我将#pragma omp parallel for在最外层的for循环之前时,代码编译良好。 但是,它给出了不正确的结果。 我怀疑两个问题是循环内的continue语句,以及嵌套循环中存在共享变量的事实。 是否可以在此代码段中使用OpenMP,如果可以,请给我正确的语法。 提前致谢。

我将指出一些显而易见的事情:

1.) double EV = 0; 在外部循环外部声明。 因此它将被所有线程共享。 因此,您将具有EV = myEVFunc();竞争条件 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...)
        ...

2.)另一个(排序)问题是您的外循环只有6次迭代。 这样您将不会获得超过6个线程。 此外,您可能会遇到4个核心的负载平衡问题...

如果您还需要更多,您还可以使用线程专用

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

不带copyin的指令将如下所示:

#pragma omp parallel for private(EV) 

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

您还可以通过数组访问获得竞争条件,例如++myArray[a1-1]; ++myArray[a2-1]; 来自不同的线程。 另外,您需要声明所有循环计数器私有a1 (由于pragma omp而不是默认私有) a2, a3是默认私有。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM