gpt4 book ai didi

c - c中openMP代码的错误答案

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:12 24 4
gpt4 key购买 nike

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

最佳答案

因为 break 语句确实不能在打开的 mp 循环中使用,请考虑以下代码

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

所以 I 是隐式私有(private)的,me 和 done 是显式共享的,我同意所有线程都必须完成他们的工作,不能尽快退出。但是在 VS'2012 上,例如,如果我尝试在 [parallel for loop] 构造中打断,我会得到“错误 C3010:'break':不允许跳出 OpenMP 结构化 block ”

#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;

关于c - c中openMP代码的错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com