【问题标题】:Inserting a NOP in FORTRAN [duplicate]在 FORTRAN 中插入 NOP [重复]
【发布时间】:2017-06-11 04:33:37
【问题描述】:

在C 中,我将使用asm ("nop"); 插入内联NOP 指令。但是,我找不到使用FORTRAN 的方法。

有没有办法强制编译器发出NOP?我使用 gfortran。

这背后的原因是我的 MPI 程序在调用 MPI_Finalize 时会出现段错误,而当我在 MPI_Finalize 之前插入 print *, '' 或 sleep(1) 时不会。为了进一步隔离这种行为,我想在调用之前插入一个NOP,看看是否仍然发生段错误。

编辑:我不知道为什么这个问题会有反对票和关闭请求。进一步搜索,这个问题类似于Segmentation fault during MPI_FINALIZE() in Fortran

【问题讨论】:

  • 您是否尝试过在所有运行时检查打开的情况下编译和运行,即 -fcheck=all?您可能也需要 -g 。您描述的行为通常是由于您写入了一些您不应该写入的内存,并且检查可能会帮助您找到这种情况 - 尽管在 MPI 代码中不能保证。
  • @IanBush 我默认使用 -fcheck=all 和 -ggdb 。编译很干净。
  • 是的,我应该这样做。但是,我还是不明白sleep 或print 是如何完全避免segfault 的。
  • 它可以修复它,因为它改变了程序在内存中的布局,从而阻止你丢弃立即导致错误的东西,而是可能产生一些更微妙和阴险的效果.

标签: assembly fortran gfortran fortran90 inline-assembly


【解决方案1】:

似乎segfault 是由于我假设MPI_Finalize(IERR) 中的IERR 是一个可选参数。当我提供一个参数时,它不会再崩溃了。

为了内联NOP,我写了一个C函数,并在fortran中使用BIND C做一个接口。

C 函数

void noop(long n)
{
    while (--n > 0)
        __asm__("nop");
}

FORTRAN 界面

interface
    subroutine nop_inline(n) bind(c, name="noop")
        use ISO_C_BINDING, only: c_long
        implicit none
        integer (c_long), value :: n
    end subroutine nop_inline
end interface

printf 或 sleep 如何能够阻止 segfault 但调用 NOP 为 1E8 次却没有,这仍然很奇怪。

我很乐意接受对此行为的任何解释作为答案。

【讨论】:

  • @High Performance Mark 真是巧合!我看到了你对stackoverflow.com/questions/11564951/… 的评论,并用use mpi 替换了所有包含的内容。谢谢。
  • 只是一个非常牵强的猜测......也许 printf/sleep 会在堆栈上留下一些垃圾,这可以作为 finalize 的有效参数。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多