在函数调用中花费了大量时间

时间:2014-10-10 13:48:37

标签: assembly fortran

我有一个在我的代码过程中多次调用的函数。它需要约45%的代码运行时间(由英特尔VTune报告),但是,由于该功能在计算上非常昂贵,我对此并不感到非常惊讶。然而,令我惊讶的是,VTune告诉我的时间量仅仅是调用函数的开销(即函数声明旁边报告的时间)。函数声明是这样的:

subroutine tempFunc(beg, matProp, timestep, matID)

我传递给它的参数只是一个integer,100 real*8个变量,另一个real*8和一个32 integer的数组。由于Fortran通过引用传递所有内容,并且只有4个变量,我不相信这个调用应该有很多开销。但是,在该功能中花费的约15%的时间是在所述开销上。查看汇编代码,所有这些时间都用在以下指令上:

mov dword ptr [rsp+rax*1], 0xccccccc
sub rax, 0x4

我知道足够的程序集知道rsp是一个堆栈指针而rax是一个64位寄存器。在我看来,第一行是移动指向rax寄存器的指针,第二行只是从该寄存器中减去一些东西。我理解错了吗?如果是这样,这两条指令究竟在做什么?如果没有,为什么这两个指令花了这么多时间?它们看起来非常无害。

1 个答案:

答案 0 :(得分:2)

不完全是。

第一条指令将由rsprax的组合指向的十六进制值加载到内存中。 [...]是内存访问操作。

第二条指令将rax减少四。这是这个动作让我相信这个可能在一个循环中完成,否则,减少就没什么意义了。

如果它在这些指令上花了15%,那就进一步支持它在一个循环中。

如果它是那么循环正在用0xcccc..cc值填充堆栈的大块,这可能很昂贵。

我们必须确定整个函数,最好是源汇编程序。你可能在函数本身中有一些本地化的东西被初始化。