MPI
通过引用数组的第一个值将数组传递给调用时,我遇到了编译时警告。考虑以下示例代码,这是我能得到的最精简的代码:
module mymod
implicit none
contains
subroutine test_sequence(input,output,icomw,N)
use MPI
integer, intent(in), contiguous :: input(:)
integer, intent(in) :: icomw, N
integer, intent(out) :: output(:)
integer :: ier
write(*,*) 'in sub: ', is_contiguous(input), is_contiguous(output)
call MPI_REDUCE(input(1),output(1),N,MPI_INTEGER,MPI_MAX,0,icomw,ier)
! -- This is the line referenced in the error
end subroutine test_sequence
end module mymod
program main
use MPI
use mymod
implicit none
integer :: icomw, id, nproc, ier, N, i
integer, allocatable :: input(:), output(:)
real :: harvest
call MPI_INIT(ier)
icomw = MPI_COMM_WORLD
N = 10
allocate(input(N), output(N))
input = 1
write(*,*) 'in main: ', is_contiguous(input), is_contiguous(output)
call test_sequence(input,output,icomw,N)
call MPI_FINALIZE(ier)
end program main
请注意,我MPI_REDUCE
只传递了 的第一个元素,input
但output
使用了 的计数N
,即(在本例中)数组的完整大小。值得注意的是,像这样引用数组部分可能不是最佳实践,但无论如何我都在这样做。
我得到以下编译器警告和运行时输出:
km-gs3% mpifort test_sequence.f90
PGF90-W-0312-Array input should be declared SEQUENCE (test_sequence.f90: 14)
PGF90-W-0312-Array output should be declared SEQUENCE (test_sequence.f90: 14)
0 inform, 2 warnings, 0 severes, 0 fatal for test_sequence
km-gs3% mpirun -np 2 ./a.out
in main: T T
in sub: F F
in main: T T
in sub: F F
我收到 PGI 14.3/OpenMPI 1.8.0 或 PGI 15.5/OpenMPI 1.8.6 的警告。我没有收到 PGI 12.9/OpenMPI 1.6.2、PGI 14.3/OpenMPI 1.6.5 或 Intel 14.0/OpenMPI 1.8.0 的警告。
据我了解,这sequence
是一个仅影响派生数据类型的关键字,input
这里output
是纯整数。此外,这些是一维数组 - 它们是否必须是连续的?
我的问题是:这里发生了什么?我可以(并且应该)将整数声明为序列吗?
编辑 1按照 francescalus 的建议,我尝试将虚拟数组定义为contiguous
. 我已经添加contiguous
到input
论点并询问了 main 和 sub 的连续性(这是一个词吗?)input
并在其中output
使用is_contiguous
。我没有重新发布整个代码,而是编辑了上面显示的原始代码。不幸的是,我仍然收到相同的编译器警告。此外,该contiguous
属性似乎没有做任何事情,因为is_contiguous
在子例程中报告了 falseinput
和output
。
我contiguous
是否正确使用了该属性?input
要求和output
成为似乎是合理的contiguous
,但不是sequence
。也许我应该PGI
直接报告这个问题,特别是现在我在一个相当新的版本上遇到了这个问题pgfortran
。