2014-10-10 101 views
0

我有一個函數在我的代碼過程中被多次調用。代碼運行總時間約爲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寄存器,並且第二行簡單地從該寄存器中減去一些東西。我的理解錯了嗎?如果是這樣,這兩條指令實際上在做什麼?如果沒有,爲什麼這兩條指令需要花費這麼多時間?他們似乎很無傷大雅。

+0

你在參數列表中分別傳遞了100個實變量? – 2014-10-11 17:04:11

+0

@VladimirF:不,matProp是100個真實* 8的數組。 – wolfPack88 2014-10-12 22:49:54

+0

它是否依賴於編譯器?例如,使用'gfortran'的相對時間是多少? – makra 2014-10-13 10:10:31

回答

2

不完全。

第一條指令是將該十六進制值加載到由rsprax組合指向的內存中。 [...]是一個內存訪問操作。

第二條指令將減去rax四。這是這個行動,導致我相信這個可能很好地完成循環,否則,它是沒有什麼意義的減少。

如果它在這些指令上花費了15%,那麼它進一步支持它在一個循環內。

如果它是,那麼循環用0xcccc..cc值填充堆棧塊,這可能很昂貴。

我們必須看到整個函數的確定,最好是源代碼爲的彙編程序。你可能會有一些本地的函數本身被初始化。

+0

所以基本上,它正在初始化一堆臨時變量在函數的開頭,然後呢? – wolfPack88 2014-10-10 14:02:50

+1

@ wolfPack88,不能肯定地說沒有看到代碼,但這是我最好的猜測。 – paxdiablo 2014-10-10 14:03:50

+0

不幸的是,代碼是專有的,所以沒有更多的我可以給你沒有得到批准。不過,我確實有一個編譯器選項將temp變量初始化爲「非常規值」,所以我將嘗試重新運行沒有該選項的代碼並查看結果。如果它消失了,那麼你是對的。 – wolfPack88 2014-10-10 14:06:00

相關問題