C++ openmp:递归任务比顺序任务慢,即使有深度限制

C++ openmp:递归任务比顺序任务慢,即使有深度限制,c++,openmp,C++,Openmp,我有一个非常大的二叉树,我想在上面做一些昂贵的计算。我想使用openmp及其任务pragmas并行化这些方法 作为测试,我已经并行化了freeTree函数,并创建了一个大的测试树示例。为了防止产生许多任务,我将任务创建限制在树的前两级。因此,实际上只创建了4个任务 以下是最简单的工作示例: 包括 包括 类节点{ 公众: int数据; 节点*l; 节点*r; 节点节点*左,节点*右:lleft,rright{} }; 节点*createRandomTreeint深度{ 如果深度==0 返回新的No

我有一个非常大的二叉树,我想在上面做一些昂贵的计算。我想使用openmp及其任务pragmas并行化这些方法

作为测试,我已经并行化了freeTree函数,并创建了一个大的测试树示例。为了防止产生许多任务,我将任务创建限制在树的前两级。因此,实际上只创建了4个任务

以下是最简单的工作示例:

包括 包括 类节点{ 公众: int数据; 节点*l; 节点*r; 节点节点*左,节点*右:lleft,rright{} }; 节点*createRandomTreeint深度{ 如果深度==0 返回新的NodeNULL,空; 返回新节点createRandomTreedepth-1,createRandomTreedepth-1; } void freeTreeNode*树{ 如果tree==NULL返回; freeTreetree->l; freeTreetree->r; 删除树; } void freeTreeParNode*树,int n=0{ 如果tree==NULL返回; 节点*l=tree->l,*r=tree->r; 如果n<2{ pragma-omp任务 freeTreeParl,n+1; pragma-omp任务 freeTreeParr,n+1; }否则{ freeTreetree->l; freeTreetree->r; } //taskwait不是必需的 删除树; } int main argc,字符常量*argv[] { std::chrono::时间点开始、结束; 节点*树=createRandomTree22; 开始=标准::时钟::系统时钟::现在; pragma omp并行共享树 { pragma-omp-single-nowait 自由树; } end=std::chrono::system\u clock::now; std::chrono::持续时间(秒)=结束-开始; std::time\u t end\u time=std::chrono::system\u clock::to\u time\u tend;
std::cout有些任务实际上是不可并行的,因为有些资源一次只能由一个线程安全地访问。这就是动态内存的情况

malloc/free现在主要是线程安全的

=>将在每个malloc/free周围执行锁定


因此,您无法轻松改进此类代码。

有些任务不是真正可并行的,因为有些资源一次只能由一个线程访问,这是线程安全的。动态内存就是这样

malloc/free现在主要是线程安全的

=>将在每个malloc/free周围执行锁定


因此,您无法轻松改进这类代码。

有专门设计的几乎无锁内存分配器,可以用作glibc提供的内存分配器的插入式替换。中列出了其中一些。有专门设计的几乎无锁内存分配器,可以用作glibc提供的内存分配器的插入式替换glibc。其中一些在中列出。