我有一个Fortran程序,它在-O3级别使用-O3,但在-Ofast优化级别使用分段错误。会有什么问题吗?
更新:问题并不是特定于工作负载的。这种情况发生在某些NCAR工作负载和WRF 3.9.1中。
发布于 2018-08-11 14:38:14
这可能是因为在默认情况下在-fstack-arrays级别启用了-Ofast选项。根据Arm Fortran编译器扶手文献,在-O3级别上不启用-fstack-arrays。
-fstack-arrays选项在本地堆栈上放置各种大小的自动数组。这通常会带来更好的性能,因为它避免了对本地数组和临时数组间接调用malloc()和free()。在典型的Linux系统中,默认情况下,每个进程的堆栈大小是8192 kB (通常可以增加,因为硬限制是“无限的”)。这给具有巨大数组的程序带来了一个问题,导致了不明显的分段错误.
解决这个问题有两种方法
-Ofast -fno-stack-arrays代替,这将禁用在本地堆栈上放置自动数组,但保留所有其他-Ofast优化。ulimit -s unlimited。这将堆栈设置为比默认大小更大的堆栈。发布于 2018-08-12 08:32:49
没有MWE,你在问问题之前就有答案了!
我对您选择使用-Ofast的-fstack感到惊讶。我一直在检查本地和自动数组的堆栈和堆性能,包括单线程和多线程。
我的经验是,对于堆栈溢出的情况,即对于较大的数组,在堆栈上放置大型数组没有明显的优势。小数组确实显示了一些性能上的好处,特别是如果它们可以驻留在缓存中。需要识别堆栈中的数组大小,因为更健壮的解决方案是堆上更大的数组。
对于多线程,每个线程都有自己的堆栈,我展示了增加线程堆栈大小和将所有数组放置在单独堆栈上的一些好处。在我的测试中,这似乎减少了记忆一致性问题,尽管一个决定性的证据可能是难以捉摸的。
我会对你选择-Ofast和-fstack的推理感兴趣。您测试过放置在堆栈上的本地和自动数组的大小限制吗?
https://stackoverflow.com/questions/51800718
复制相似问题