为什么在添加数组中存储的数字时在Openmp中出现分段错误?

时间:2019-04-05 10:24:39

标签: parallel-processing fortran openmp gfortran

我是Openmp的新手。我对存储在数组中的N个整数求和,并使用gfortran编译代码。直到N = 10 ^ 6,从串行和并行代码获得的结果是完全相同的。对于N = 10 ^ 7,串行代码正在运行,但是并行代码(使用-fopenmp标志进行编译后)给出“分段错误”。我在这里给出了我的代码。谁能帮助我为什么会这样?

manifest.json

1 个答案:

答案 0 :(得分:1)

我以前也遇到过同样的问题。问题是您的代码似乎需要很大的内存。

在编译代码-mcmodel=medium时,请确保使用编译器选项。另外,当您使用-fopenmp时,编译器会系统地调用-frecursive,这会将堆栈大小限制为默认值。因此,您的代码尝试破坏导致分段错误的堆栈限制。要摆脱此问题,您必须取消堆栈的默认限制。快速执行此操作的一种方法是在终端上运行命令ulimit -s unlimited,然后在同一终端内启动代码。您还可以使用值为n的良好编译选项-fmax-stack-var-size=n来设置堆栈的大小,使其适合您的数据。

此外,我建议使用reduction (+:sum)子句来计算您的总和,而不是在这种情况下声明一个无效的和可避免的关键区域。

希望对您有所帮助。