gpt4 book ai didi

c++ - OpenMP:如何在每个线程中使用递归函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:07 28 4
gpt4 key购买 nike

#include <stdio.h>
#include<array>
#include<vector>
#include <omp.h>

std::vector<int> pNum;
std::array<int, 4> arr;
int pGen(int);
int main()
{
pNum.push_back(2);
pNum.push_back(3);
pGen(10);
for (int i = 0; i < pNum.size(); i++)
{
printf("%d \n", pNum[i]);
}
printf("top say: %d", pNum.size());
getchar();
}
int pGen(int ChunkSize)
{
//
if (pNum.size() == 50) return 0;
int i, k, n, id;
int state = 0;

//
#pragma omp parallel for schedule(dynamic) private(k, n, id) num_threads(4)
for (i = 1; i < pNum.back() * pNum.back(); i++)
{
//
id = omp_get_thread_num();
n = pNum.back() + i * 2;
for (k = 1; k < pNum.size(); k++)
{
//
if (n % pNum[k] == 0) break;
if (n / pNum[k] <= pNum[k])
{
//
#pragma omp critical
{
//
if (state == 0)
{
//
state = 1; pNum.push_back(n); printf("id: %d; number: %d \n", id, n); pGen(ChunkSize); break;
}
}
}
}
if (state == 1) break;
}

}

这是我上面的代码。我正在尝试为每个动态、静态和引导的 openMP 调度找到前 50 个质数。我从动态开始。不知何故,我意识到我必须使用递归函数,因为我不能在并行结构中使用 do -。

当我调试上面的代码时,控制台立即打开并关闭,我只能看到“id:0, number:5”和一个“error: blablabla(something)”

奇怪的是我从来没有得到 getchar() 并输出我用来存储素数的 vector 。我认为这是关于递归函数的。还有其他理论吗?

编辑:我碰巧发现了错误: this is the error

最佳答案

我不知道这对您的算法是否重要,但由于您在 pNum 中添加了数字主循环中的 vector ,pNum.back()将改变迭代。因此,并行循环的边界将在循环本身期间发生变化:for (i = 1; i < pNum.back() * pNum.back(); i++)

OpenMP 不支持此功能。只有在 Canonical Loop Form 中的循环才能与 OpenMP 并行化.该链接对其进行了详细解释,但归结为您应该在进入循环之前知道并修复边界:

lb and b: Loop invariant expressions of a type compatible with the type of var

因此,您的代码具有未定义的行为。它可能编译也可能不编译,可能运行也可能不运行,并且可以给出任何结果(如果有的话)(或者只是重新格式化您的硬盘)。

如果pNum.back()不重要在迭代中进化,那么您可以简单地在循环之前对其进行评估,并将此值用作 for 中的上限陈述。但如果它很重要,那么您将不得不找到另一种方法来并行化您的循环。

最后,附注:此算法使用嵌套并行,但您并未明确允许这样做,因为默认情况下禁用嵌套并行,只有最外层调用 pGen()将生成 OpenMP 线程。

关于c++ - OpenMP:如何在每个线程中使用递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36210984/

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