assembly - 在 FORTRAN 中插入一个 NOP

标签 assembly fortran gfortran fortran90 inline-assembly

<分区>

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

printfsleep 能够防止 segfault 但是调用 NOP 仍然很奇怪 1E8 次没有。

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

关于assembly - 在 FORTRAN 中插入一个 NOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480395/

相关文章:

汇编:MOV 或 DEC 影响零标志吗?

c++ - 是否可以隐藏在 C++ 代码中定义的密码

Fortran 存储连接字符串

fortran - 如何对文件夹中的所有文件运行 FORTRAN 程序?

linux - OpenMP 和并行化问题

fortran - 将 gfortran 链接到 LAPACK 和 BLAS 时出错

c - 数据段前未初始化的可写数据

assembly - 每个 asm 指令的大小是多少?

algorithm - Matlab FFT 和 Fortran Rosetta 代码 FFT 的差异

c++ - 使用 Fortran 编译和链接 C++