I'm encountering a compile-time warning when passing arrays to MPI calls by referencing their first value. Consider the following example code, which is the leanest I could get:
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
Notice that I'm passing MPI_REDUCE only the first element of input and output but using a count of N, which is (in this case) the complete size of the array. It's worth noting that referencing array sections like this probably isn't best practice but I'm doing it anyway.
I get the following compiler warning and runtime output:
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
I get the warning with PGI 14.3/OpenMPI 1.8.0 or PGI 15.5/OpenMPI 1.8.6. I do not get the warning with PGI 12.9/OpenMPI 1.6.2, PGI 14.3/OpenMPI 1.6.5, or Intel 14.0/OpenMPI 1.8.0.
It's my understanding that sequence is a keyword affecting derived data types only, and input and output here are plain integers. Also, these are 1D arrays - don't they have to be contiguous anyway?
My question is: what's going on here? Can (and should) I declare integers as sequence?
Edit 1 Following the advice of francescalus, I've attempted to define the the dummy array as contiguous. I've added contiguous to the input argument and inquired about the contiguity (is that a word?) of input and output using is_contiguous in main and sub. Rather than re-post the entire code, I've edited the original code shown above. Unfortunately, I still get the same compiler warning. Furthermore, the contiguous attribute doesn't seem to be doing anything because is_contiguous reports false in the subroutine for both input and output.
Am I using the contiguous attribute correctly? It seems reasonable to require input and output to be contiguous, but not sequence. Perhaps I should report this to PGI directly, especially now that I've encountered the problem on a reasonably new version of pgfortran.
contiguousattribute oninput?inputis contiguous even without thecontiguousattribute, so the result ofis_contiguoussurprises.is_contiguouseverywhere for bothinputandoutput.