我是Openmp的新手。我对存储在数组中的N个整数求和,并使用gfortran编译代码。直到N = 10 ^ 6,从串行和并行代码获得的结果是完全相同的。对于N = 10 ^ 7,串行代码正在运行,但是并行代码(使用-fopenmp标志进行编译后)给出“分段错误”。我在这里给出了我的代码。谁能帮助我为什么会这样?
manifest.json
答案 0 :(得分:1)
我以前也遇到过同样的问题。问题是您的代码似乎需要很大的内存。
在编译代码-mcmodel=medium
时,请确保使用编译器选项。另外,当您使用-fopenmp
时,编译器会系统地调用-frecursive
,这会将堆栈大小限制为默认值。因此,您的代码尝试破坏导致分段错误的堆栈限制。要摆脱此问题,您必须取消堆栈的默认限制。快速执行此操作的一种方法是在终端上运行命令ulimit -s unlimited
,然后在同一终端内启动代码。您还可以使用值为n的良好编译选项-fmax-stack-var-size=n
来设置堆栈的大小,使其适合您的数据。
此外,我建议使用reduction (+:sum)
子句来计算您的总和,而不是在这种情况下声明一个无效的和可避免的关键区域。
希望对您有所帮助。