在 C
中,我会使用 asm ("nop");
插入内联 NOP
指令。但是,我找不到使用 FORTRAN
的方法。
有没有办法强制编译器发出一个NOP
?我使用 gfortran。
这背后的原因是我的 MPI 程序在调用 MPI_Finalize
时出现段错误,而当我插入 print *, ''
或 sleep 时却没有(1)
就在 MPI_Finalize
之前。为了进一步隔离此行为,我想在调用之前插入一个 NOP
并查看段错误是否仍然发生。
编辑: 我不确定为什么会有反对票和关闭此问题的请求。进一步搜索,这个问题类似于Segmentation fault during MPI_FINALIZE() in Fortran
似乎 segfault
是由于我假设 MPI_Finalize(IERR)
中的 IERR
是一个可选参数。当我提供参数时,它不会再崩溃。
为了内联NOP
,我写了一个C
函数,用fortran中的BIND C
做了一个接口(interface)。
C 函数
void noop(long n)
{
while (--n > 0)
__asm__("nop");
}
FORTRAN 接口(interface)
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
次没有。
我很乐意接受对此行为的任何解释作为答案。