2014-04-04 58 views
3

正如標題所說,我對數組本身和數組子集之間的類型差異感興趣。對於背景,我將數組傳遞給一個MPI函數,該函數在用零長度數組調用時會觸發'數組索引超出邊界'錯誤,但只能使用子集符號。這是問題的一個簡化的例子在眼前:在Fortran中,將myArray或myArray(:)傳遞給函數有什麼區別?

real(4), allocatable :: myData(:) 

allocate(myData(numElements), STAT=iStat) 

! The following calls only differ in the second argument 
! Passing array itself always works (e.g. myData) 
call MPI_FILE_WRITE_ALL(file, myData, MPI_REAL4, numElements, & 
         MPI_STATUS_IGNORE, mpiErr) 

! Passing converted subset always works (e.g. real(myData(:), 4) 
call MPI_FILE_WRITE_ALL(file, real(myData(:), 4), MPI_REAL4, numElements, & 
         MPI_STATUS_IGNORE, mpiErr) 

! Passing subset works unless numElements is zero 
call MPI_FILE_WRITE_ALL(file, myData(:), MPI_REAL4, numElements, & 
         MPI_STATUS_IGNORE, mpiErr) 

這裏是對documentation for MPI_FILE_WRITE_ALL的鏈接,但它似乎只需要BUFFER(*)。任何想法爲什麼這些不同的調用行爲如此不同?

+6

http://software.intel.com/zh-cn/blogs/2008/03/31/doctor-it-hurts-when-i-do-this/ –

回答

0

要回答你的標題問題:

當傳遞一個數組片必須創建一個臨時的陣列和數據必須複製到它,通過這個不需要全陣列和參考時使用原始數組而不是複製。

如在由M. S. B.和評價提供的鏈接所提到的,使所述片還導致的數組邊界信息的丟失。

+0

這種差異的討論解決問題主體中的問題,僅僅是非特定的標題。但是,在後者中,這太簡單了。拷入不是數組切片的「必須」,對於整數數組不是「不可」:即使對於整數數組,如果啞參數具有「值」屬性,也必須複製。關於「界限」,這隻適用於延遲形狀的數組,這在這個問題中不太可能是這種情況。對於假設形狀數組,邊界信息不會傳遞,無論實際參數的形式如何。 – francescalus

+0

@francescalus足夠公平,出於興趣如何通過切片時避免副本? – d1999

+0

通常希望編譯器儘可能避免複製,但這些東西會因編譯器/編譯選項而異。請注意,許多編譯器在發生複製時提供診斷。 – francescalus

相關問題