1

我编写了一个程序,在 100000000 的整数数组中搜索一个元素并将其初始化为 i+1(i 是元素的索引)。现在我正在搜索 73500320,如果找到整数“me”,则将其更新为 1,“me”被初始化为 -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;
        }
    }
}
4

1 回答 1

0

由于 break 语句确实不能在开放 mp 循环中使用,请考虑以下代码

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

所以我是隐式私人的,我和完成是明确共享的,我同意所有线程都必须完成他们的工作并且不能早点出去。但是例如在 VS'2012 上,如果我尝试在 [parallel for loop] 构造中放置一个中断,我会得到“错误 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;
于 2013-07-10T07:12:48.523 回答