我编写了一个程序,它在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;
}
}
}
答案 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;