我正在尝试并行化依赖于大量递归算法的项目的各个部分。
其中大多数是某种形式的二叉树创建或遍历和处理。
我被困在 RedHat 上使用 GCC v. 4.1.2 和 Windows 上的 VC++ 编译器(两者都不支持 OpenMP 3.0 及其方便的task
构造)。我发现这个问题似乎可以通过嵌套的并行部分和一些节流来完成工作,以防止线程数量过多。
我的问题:有什么方法可以避免这种方法?一些函数在每个时间步被调用,重复创建和销毁线程组的开销是不可接受的。
这是我一直在使用的递归函数的基本结构,与链接的问题一致:
extern int threads;
omp_set_nested(1); omp_set_num_threads(2);
void cell::updateRecursive() {
// do stuff for cell for this timestep
#pragma omp flush(threads)
if (threads>=omp_get_num_procs()) {
child0->updateRecursive(); child1->updateRecursive(); // no new threads
} else {
#pragma omp atomic
threads++;
#pragma omp flush(threads)
#pragma omp parallel sections nowait
{
#pragma omp seciton
child0->updateRecursive();
#pragma omp section
child1->updateRecursive();
}
#pragma omp atomic
threads--;
}
}
如果不经常调用此函数,这就足够了。我想要一种递归方法,可以使用现有的线程团队来执行工作,而不是在遍历树时创建一个。
如果没有 ,这可能task
吗?我已经尝试过简单地使用sections
,但显然它们不能嵌套使用现有的线程团队。