带有continue语句的OpenMP和Nested for循环

时间:2012-02-01 04:51:22

标签: 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 = 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来并行化循环。当我放置时,代码编译得很好  在最外面的for循环前面#pragma omp parallel for。但是它给出了错误的结果。我怀疑循环中的continue语句和嵌套循环中存在共享变量这两个问题。 是否可以将OpenMP与此代码段一起使用,如果是这样,任何人都可以请给我正确的语法。提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

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...)
        ...

2.)另一个(sorta)问题是你的外环只有6次迭代。所以你不会超过6个线程。此外,您可以通过4核心来解决负载平衡问题......

答案 1 :(得分:1)

如果您需要更多内容,也可以使用私密线程

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

没有copyin,指令看起来像:

#pragma omp parallel for private(EV) 

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

答案 2 :(得分:0)

你也有阵列访问的竞争条件,例如++myArray[a1-1]; 和来自不同主题的++myArray[a2-1];。 另外你需要声明所有循环计数器私有,a1(由于pragma omp是默认的私有,但不是),a2, a3 ..

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