c - 并行递归算法

标签 c recursion openmp

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

#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,但我不确定它是否最适合我的情况。速度提升远低于我的预期。对于这样的代码,有没有更好的方法?

最佳答案

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

参见 this question关于如何为两个变量和this question做这件事对于阵列情况。

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

关于c - 并行递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973082/

相关文章:

java - 如何在Java中正确读取 "maze.txt"文件

递归重命名文件夹的 Bash 脚本

c++ - OpenMP减少子句不适用于循环计数很大的int

c++ - 排序 vector 的交集

c - 使用 OpenMP 在不同内核上运行不同部分的代码

c - string concat C,有更好的解决方案吗?

c - 没有得到输出

c++ - 指向(定义了指针数组)字符串的指针数组 : Are the strings stored sequential in memory?

javascript - Jquery递归函数提供错误结果

c - C 中函数的多重定义,原型(prototype)设计