正如标题所说,我对数组本身和数组子集之间的类型差异感兴趣。对于背景,我将数组传递给MPI函数,该函数触发超出界限的数组索引。使用零长度数组调用时出错,但仅使用子集表示法。以下是手头问题的简化示例:
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(*)。关于为什么这些不同的调用表现得如此不同的任何想法?
答案 0 :(得分:0)
回答关于标题的问题:
当传递数组切片时,必须创建临时数组并且必须将数据复制到其中,当传递整个数组时,这不是必需的,并且使用对原始数组的引用而不是复制。
如M. S. B.提供的链接中所述,在评论中,传递切片也会导致数组边界信息丢失。