我使用以下代码通过 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/