c - OpenMP 任务 - 为什么在 ~10k 的迭代次数较多时会出现段错误?

标签 c parallel-processing segmentation-fault openmp

我使用以下代码通过 OpenMP 任务构造查找数组元素的总和。
n = 10000 之前,代码一直在产生正确的结果。

但除此之外,我遇到了段错误。使用 gdb,我发现错误发生在对 reduce() 的递归调用之一。输入数组分配没有问题,我已经验证过了。

有人对问题可能有什么建议吗?

int reduce (int *arr, unsigned long int n)
{   
    int x;
    if (n <= 0)
        return 0;

    #pragma omp parallel
    {   
        #pragma omp single nowait
        {   
            #pragma omp task shared(x)
            x = reduce(arr, n-1) + arr[n-1];
            #pragma omp taskwait
        }
    }
    return x;
}

最佳答案

看起来您正在通过函数调用的递归深度遇到“堆栈溢出”。请记住,大多数 openmp pragma 自己生成函数,这可能会干扰尾递归优化。

如果您通过 valgrind 运行,它应该警告您堆栈溢出。

关于c - OpenMP 任务 - 为什么在 ~10k 的迭代次数较多时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46919618/

相关文章:

c++ - 如何使用二维数组在 C++ AMP 中声明 array_view 或数组对象

c - 为什么伪随机函数不直接将种子作为参数?

c++ - x86_32/64 中指针和整数之间的转换

CoreAudio 输入渲染回调从外部音频接口(interface) Mac OS 10.14 Mojave 渲染全 0

r - { : task 1 failed - "could not find function "knn""中的错误

c - 读取文件时 _IO_ getc 出现段错误

c - linux内核子系统dm-crypt和ecryptfs有什么区别?

R foreach 循环 - 包加载失败

c++ - 这是有效的内存对齐吗?如果没有,应该如何解决?

linux - 不执行任何操作的简单 _start 末尾的段错误