我有一個函數在我的代碼過程中被多次調用。代碼運行總時間約爲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
寄存器,並且第二行簡單地從該寄存器中減去一些東西。我的理解錯了嗎?如果是這樣,這兩條指令實際上在做什麼?如果沒有,爲什麼這兩條指令需要花費這麼多時間?他們似乎很無傷大雅。
你在參數列表中分別傳遞了100個實變量? – 2014-10-11 17:04:11
@VladimirF:不,matProp是100個真實* 8的數組。 – wolfPack88 2014-10-12 22:49:54
它是否依賴於編譯器?例如,使用'gfortran'的相對時間是多少? – makra 2014-10-13 10:10:31