Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在函数调用中花费的大量时间_Assembly_Fortran - Fatal编程技术网

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

Assembly 在函数调用中花费的大量时间,assembly,fortran,Assembly,Fortran,我有一个函数,在编写代码的过程中被多次调用。代码运行时间约占总时间的45%(据英特尔VTune报告),但是,由于函数的计算成本很高,我对此并不感到惊讶。不过,令我惊讶的是,VTune告诉我,我只在调用函数的开销上花费了大量时间(即,在函数声明旁边报告的时间)。函数声明如下所示: subroutine tempFunc(beg, matProp, timestep, matID) 我传递给它的参数只是一个整数、100个实数*8变量、另一个实数*8,以及一个32个整数的数组。由于Fortran通过

我有一个函数,在编写代码的过程中被多次调用。代码运行时间约占总时间的45%(据英特尔VTune报告),但是,由于函数的计算成本很高,我对此并不感到惊讶。不过,令我惊讶的是,VTune告诉我,我只在调用函数的开销上花费了大量时间(即,在函数声明旁边报告的时间)。函数声明如下所示:

subroutine tempFunc(beg, matProp, timestep, matID)
我传递给它的参数只是一个
整数
、100个
实数*8
变量、另一个
实数*8
,以及一个32个
整数
的数组。由于Fortran通过引用传递所有内容,并且只有4个变量,因此我不认为与此调用相关的开销太大。然而,在函数中花费的大约15%的时间用于上述开销。查看汇编代码,所有这些时间都花在以下说明上:

mov dword ptr [rsp+rax*1], 0xccccccc
sub rax, 0x4
我知道足够多的汇编代码,知道
rsp
是堆栈指针,
rax
是64位寄存器。在我看来,第一行是移动一个指向
rax
寄存器的指针,第二行只是从寄存器中减去一些东西。我的理解错了吗?如果是这样,这两个指令实际上在做什么?如果没有,为什么这两个说明要花这么多时间?它们看起来很无害。

不完全是

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

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

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

如果是,那么循环将用
0xcccc..cc
值填充堆栈的一块,这可能会很昂贵


我们必须看到整个函数才能确定,最好是源代码和汇编程序。你可能会在函数本身中有一些局部变量被初始化。

因此,基本上,它是在函数的开头初始化一组临时变量,那么?@wolfPack88,在没有看到代码的情况下不能肯定,但这是我最好的猜测。不幸的是,代码是专有的,因此,没有得到批准,我不能给你更多。我确实有一个编译器选项设置为将临时变量初始化为“一个不寻常的值”,所以我将尝试在没有该选项的情况下重新运行代码,并查看结果。如果它消失了,那么你是对的。@wolfPack88,这将是一个好的开始。将未初始化的变量设置为哨兵值(如
0xdeadbeef
)有助于调试,但这样做对性能没有好处。我可能还应该看一下下面的2条指令。。。它们是
cmp-rax、0x4
jnle 0x14055fe46
,其中
0x14055fe46
是第一个
mov
命令的地址。事实上,这是一个为堆栈变量分配随机值的循环。谢谢你的帮助。你在参数列表中分别传递了100个实数变量吗?@VladimirF:不,matProp是一个100个实数*8的数组。它依赖于编译器吗?例如,使用
gfortran
的相对时间是多少?