[英]Why this Fortran function takes forever between printing two Hello World's
以下 Fortran function 在打印Hello World 1
后需要永遠打印Hello World 2
。
program Test_Long_Run
implicit none
! Variables
integer,allocatable,dimension(:) :: test
integer :: i, j, k, l, m, int
allocate(test(1000*100)); test = 0
! Body of Test_Long_Run
print *, 'Hello World 1'
do k = 1,100
do j = 1,100
do i = 1,100
do m = 1,100
do l = 1,1000
test(l*m) = 2
int = 2
enddo
enddo
enddo
enddo
enddo
print *, 'Hello World 2'
end program Test_Long_Run
如果我注釋掉test(l*m) = 2
,它會運行得非常快
內部主體中的指令執行 1000 億次乘法和對表的賦值,以及對變量的賦值。 您寫入的數組包含 10 萬個整數,因此不適合任何緩存。 您寫入的元素不是連續的(步幅:1000*4 字節),因此每次寫入都必須繞過/使緩存無效並涉及 RAM。 這很慢。 每個分配甚至數百個處理器周期。 如果您的處理器以 2GHz 或每秒 20 億條指令運行,那么您每秒最多將執行 1000 萬次分配。 現在將 1000 億除以 1000 萬。 一萬秒?
如果刪除對數組的分配會發生什么? 程序將被分配給單個變量。 分配一個常數值。 一個體面的編譯器會注意到所有這些循環都可以被丟棄,只剩下一條指令: int = 2
。
請記住,如果編譯器決定不會改變程序的行為,它就有權修改您的源代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.