首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行递归算法

并行递归算法
EN

Stack Overflow用户
提问于 2019-05-03 15:37:35
回答 1查看 133关注 0票数 1

我试图开发一些递归算法,我想使用开放mp并行运行。我需要为多个输入运行算法,所以我希望每个线程运行1个输入。每个线程都是独立的,但是结果存储在代码显示的相同的全局变量(求和)中:

代码语言:javascript
复制
#include <stdio.h>
#include <omp>

double * resultA;
double * resultB;

void recursiveAlgorithm(double a)
{
    double b = someFunction(a);
    uint c = anotherFunction(a);

    if (b < 0)
    {
         #pragma omp critical
         {
              resultA[c] = resultA[c] + b;
         }
         return;
    }
    if (b > 100)
    {
         #pragma omp critical
         { 
              resultB[c] = resultB[c] + b;     
         } 
         return;
    } 
    recursiveAlgorithm(b);
}


int main( int argc, const char* argv[] )
{
    double input[5] = {0, 1, 2, 3, 4};

    resultA = malloc(1000*1000*3, sizeof(double));
    resultB = malloc(1000*1000*3, sizeof(double));

    #pragma omp parallel for
    for (uint i; i < 5; i++){
         recursiveAlgorithm(input[i]);
    }
}

我一直在使用关键部分来确保变量resultA和resultB不会同时被访问,但我不确定它是否适合我的情况。速度的提高比我预期的要小得多。这样的代码有什么更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-03 15:44:37

听起来你的问题可能会通过减少模式得到更好的解决。但是,如果没有更多关于你实际计算的信息,就很难判断。

有关如何对两个变量执行此操作,以及如何处理数组情况下的this question,请参见this question

还要注意,您始终可以自己实现递归堆栈,并将各个调用并行化。如果某些递归比其他递归更深入,那么最明显的好处是线程之间的作业平衡更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55973082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档