我正在尝试并行化依赖于大量递归算法的项目部分。
大多数都是某种形式的二叉树创建或遍历和处理。
我在RedHat和Windows上的VC ++编译器上使用GCC v.4.1.2(两者都不支持OpenMP 3.0及其方便的task
构造)。
我发现this question似乎通过嵌套的并行部分和一些限制来完成工作,以防止过多的线程。
我的问题:任何避免这种方法的方法?在每个时间步调用一些函数,重复创建和销毁一个线程团队的开销是不可接受的。
这是我一直在使用的递归函数的基本结构,与链接的问题一致:
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
,但显然它们不能嵌套使用现有的线程团队。