簡體   English   中英

為什么這個 Fortran function 在打印兩個 Hello World 之間需要永遠

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM