2011-06-10 57 views
1

我試圖集成兩個Fortran 9x代碼,其中包含具有相反數組排序的數據數組。一個代碼(我稱之爲舊代碼)有一個已建立的子程序庫,我試圖儘可能有效地利用這些代碼(即新代碼)(即不必創建臨時數組來重新排序數組並將其傳遞給子例程,然後必須用新的重新排序結果替換舊數組)。例如,Fortran指針將重新排序的數組傳遞給過程

舊代碼:
oldarray(1:N,1) - >對於n個元素變量1
oldarray(1:N,2) - >變量2 n個元素
..等上

新的代碼:
newarray(1,1:N) - >對於n個元素
newarray變量1(1,1:N) - >變量2 n個元素
..等

變量索引不是n在兩個代碼之間必然存在關聯。如果我只需要一個變量傳遞給一個過程,我只是通過newarray(1,1:n),程序不知道其中的差異。然而,如果一個來自舊代碼的過程需要舊數組的變量1-6,它可能對應於變量2,6,8,1,4,3(我剛挑選了任意數字)的新陣列,是否可以創建一個指針我可以傳遞給程序? 更簡單的一面,是否可以爲新數組的轉置創建指針?作爲一個例子,指針(1000,6)指向新陣列(6,1000)。

注意:重寫新代碼使用相同的數組排序是不可能的,因爲兩個代碼都使用最適合其無法更改的循環結構的數組排序。

另外,我對指針的使用經驗很少。我知道我可以創建一個由指針數組組成的派生數據類型,但我不認爲我能夠以所需的方式將它傳遞給一個過程(我可能錯了,因爲我對派生數據類型的使用經驗也很少)。我的參考書(Fortran 95/2003,適用於科學家和工程師)僅探索鏈接列表和樹的指針的高級應用程序。除了本書在互聯網上的內容外,我還發現了一些Fortran指針信息。

謝謝你的幫助。

回答

1

我認爲答案是否定的,你不能這樣做,反正也無濟於事。

你可以用數組指針來做各種超酷的事情,跨越數組等等,但是我沒有看到它如何改變數據的順序。

所以我可能是錯的,這是可能的,但那麼問題是:它會如何幫助你?據推測,你希望用戶指針重新排列數據而不需要複製;但是當你傳遞這樣的東西時,編譯器被允許進行拷入,拷出;例如,創建一個臨時數組,將數據複製,傳遞給子例程,並在返回時複製數據。事實上,在這種情況下,在性能方面幾乎肯定會是正確的做法;這樣舊代碼可以以快速順序訪問內存,並且轉置副本也可以以快速方式完成。

所以我懷疑正確的方法來處理這個問題是明確地做copy-in/copy-out的方法。

+0

這是一個CFD代碼中可以有幾百萬雙精度變量的元素,並明確創建這些臨時數組可以很容易地進入GB內存的(理想情況下這種規模的問題將在集羣上,從而就可以這樣做分佈在許多系統中)。我也意識到,如果指針方法是可能的,由於使用舊循環結構的內存訪問,性能可能會顯着下降。但是,與不需要內存的情況相比,我會減少性能。 – Seth 2011-06-10 20:07:03

+0

但事情就是這樣 - 即使有指針,這些副本是否製作完成都不在你的掌控之中。至少如果你製作副本,你確切知道需要多少內存。 – 2011-06-10 20:10:01

+0

此外,它不一定重新排序數據,只要傳遞我想更改的所需內存地址。根據我的理解,指針只是指向目標占用的內存地址的鏈接。如果這是正確的,理論上你可能有一組內存地址對應於一個數組,但是以重新排序的方式,而不需要實際重新排序數組。 – Seth 2011-06-10 20:19:41