【问题标题】:Intel Fortran - chkstk.asm not found英特尔 Fortran - 未找到 chkstk.asm
【发布时间】:2016-10-19 16:57:53
【问题描述】:
我正在使用 Visual Studio + Intel Fortran 编译 Fortran 程序。该程序连续运行良好。
但是,当我尝试并行化代码时卡住并给我错误:chkstk.asm not found。
有趣的是,如果我减小一些数组的大小,代码会再次很好地并行化并且不会显示错误。
我在this link 上尝试了解决方案:转到解决方案(不是项目)的属性页,在通用属性/调试源文件下,列出“无调试”下的 chkstk.asm 文件,但没有运气.
下面还有错误的打印屏幕。
【问题讨论】:
-
这只是一个调试器通知。 chkstk.asm 是 CRT 函数的源文件,__chkstk()。它验证你的程序不会因为这个网站的名字而崩溃。在它发生之前,这很重要,因为当它发生时,你几乎没有什么可看的。或者更糟的是,它可能不会使您的程序崩溃,而是随机损坏内存。非常典型的 Fortran 问题,它喜欢大数组。所以不应该发生的事情确实发生了,堆栈跟踪讲述了这个故事。从这里我们看不到。
标签:
visual-studio
intel
fortran90
【解决方案1】:
您的程序出现问题,并且您的调试器(在本例中为 Visual Studio)已收到通知。然后,您的调试器正在寻找与问题所在位置相关的源代码。它找不到该源代码,很可能是因为您没有安装它(它是底层 C 运行时库的一部分)。
但您并不特别需要(或想要)该源代码来了解问题的本质。
根据其名称,chkstk.asm 中的代码检查/探测堆栈,以确保堆栈上有足够的空间用于堆栈分配。检查失败的可能是因为堆栈空间不足。您可以使用调用堆栈窗口来识别您的 Fortran 源代码中与堆栈分配相关的位置 - 它可能与调用过程(为函数的局部变量创建存储)或表达式(创建函数结果等的临时存储)。
并行代码倾向于大量使用堆栈,因为这是一种使存储特定于特定执行线程的简单方法。您一般需要增加为每个堆栈保留的内存量(在相关可执行项目的属性中,请参见 Linker > System > Stack Reserve Size 下,默认只有 1MB 左右,尝试将其设为 10MB)。您可能还想告诉编译器使用基于堆的分配而不是基于堆栈的分配(在 Fortran > 优化下的项目属性中,将堆数组设置为 0)。
英特尔论坛上有很多关于此类问题的帖子和文章。