c中openMP代码的错误答案

时间:2013-07-09 20:32:04

标签: c parallel-processing openmp

我编写了一个程序,它在100000000的整数数组中搜索一个元素,并将其初始化为i + 1(我是元素的索引)。现在在这里我正在搜索73500320,并将整数'me'更新为1如果找到,'我'被初始化为-1。但是当我打印我时,它有时打印为-1,有时打印为1.(应该总是找到它!)我无法弄清楚错误......

#pragma omp parallel 
{
    int thread = omp_get_thread_num();
    int num_thread=omp_get_num_threads();
    int beginpos = (thread + 0) * (100000000 / num_thread);
    int endpos   = (thread + 1) * (100000000 / num_thread);
    for (i = beginpos; i < endpos; i++)
    {
        #pragma omp flush(done)
        if (done == 1)
        {
            break;
        }

        if (a[i] == 73500320)
        { 
            /* Inform the other threads that we found the element. */
            done = 1;
            #pragma omp flush(done)
            me = 1;
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

由于break语句实际上不是你可以在开放的mp循环中使用的东西,请考虑以下代码

它使用OpenMP静态计划(类似于您在并行区域开头添加的逻辑。

所以我隐晦地私有,我和明确分享了,并且我同意所有线程必须完成他们的工作并且不能更快地完成。但是在VS'2012上,例如,如果我试图在[并行for循环]构造中暂停,我得到“错误C3010:'break':跳出OpenMP结构块不允许”

#pragma omp parallel for shared(me, done)
for (int i = 0; i <  100000000; i++)
{
    if (done == -1)
    {
    if (a[i] == 73500320)
    { 
        cout << "thread " << omp_get_thread_num() << " found at i=" << i << endl;
        me = 1;
        done = 1;          
    }
    }
}

cout << me << endl;