使用OpenMP v.2.0并行化递归函数

时间:2013-06-27 15:28:08

标签: c++ recursion parallel-processing openmp

我正在尝试并行化依赖于大量递归算法的项目部分。

大多数都是某种形式的二叉树创建或遍历和处理。

我在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,但显然它们不能嵌套使用现有的线程团队。

0 个答案:

没有答案