2013-05-29 57 views
0

我有一個fortran代碼,我不得不修改以包含一個新的庫。最初在代碼中,數組的大小通過Makefile傳遞,這意味着每次我想改變數組的大小時,我都必須重新編譯代碼。我改變了這個從「輸入參數文件」中讀取輸入數組的大小,以避免每次都需要重新編譯。但是,由於各種原因,我的代碼比以前慢得多。可分配性和靜態大小的數組的性能

與我的老闆交談時,他認爲這可能是因爲我們沒有在編譯時傳遞數組的大小,代碼沒有得到很好的優化。這可能是真的嗎?

感謝

---------------編輯---------------------

最初在makefile中有這些行

NL = 8 
@echo Making $(SIZE_FILE) ..... 
echo "  integer, parameter(nl = " $(NL) ")" > $(SIZE_FILE) 

這創建了一個值爲「NL」的「sizefile」。該文件是「包含」在主程序d在作爲標題,然後數組被宣佈這樣的Fortran文件:

include "sizefile" 
real*8, dimension ur(nl) 

現在我已經宣佈了一個名爲「read_input_parameters」子程序這是由程序調用它讀取一個值爲「Nl」的文本文件。然後我分配這樣的數組:

program test 

    integer n 
    allocatable :: ur(:) 

    call read_input_parameters(n) 

    allocate(ur(n)) 

    *operations* 

    deallocate(ur) 
    stop 
    end 
+0

它是*可能的*,但你將不得不展示你現在如何分配你的數組與之前的操作。在沒有看到您的代碼的情況下,不可能知道它是否沒有得到很好的優化,或者我們無法指示您解決問題的方式。 – SethMMorton

+0

另外,你應該改變這篇文章的標題來描述問題。 「Makefile內部的參數」並不是你真正的問題,它是可分配性和靜態大小數組的性能。 – SethMMorton

+0

什麼操作系統和配置有多大?聽起來好像你正在強制頁面交換。 – agentp

回答

1

您應該使用一個分析器並查找緩慢的操作併發布其代碼。你顯示的代碼是無用的。結果是否正確,至少?

緩慢可能是由許多因素造成的。其中之一是錯誤的參數傳遞,這使得必須進行復制/複製。另外,子程序不知道數組是否連續的事實可能會造成一些傷害,但不是很大。

+0

謝謝!該代碼給出了正確的結果。這個子程序在程序開始時只調用一次,並且運行時間不到一秒鐘。整個代碼運行幾天後。我會研究探查器。 – jhaprade