It is a 64bit Fortran program that was compiled by Compiler 11.1.51 under Windows 7 pro 64bit and MS MPI. When I moved to Windows 10 and run the same program I noticed that arrays are not any more sent between tasks. I unstalled the old MS MPI and replace it with a new one but the problem still exist. Is there any idea why is that? I need help.
Your question is probably too general to get a good or indeed any answer. What do you mean by "that arrays are not any more sent between tasks". You should give some more specific information on this problem, there are usually plenty of people on this forum who can help.
It would be better to post this on https://software.intel.com/en-us/forums/intel-clusters-and-hpc-technology
The MPI gurus are over there. This said, it may be an issue with (your old version of Fortran and) Windows 10 and MSMPI. Have you tried OpenMPI or Intel's MPI?
As known in programming, an array is a set of memory locations that are accessible via one index or more. I used to send and receive arrays of one index between tasks where I specify the start of each array (where index value = 1) and its length, which is not allowable under Windows 10. Anyhow, thank you for your attention and I will try the HPC forum, If you do not know, where I might have the answer.
>> I used to send and receive arrays of one index between tasks where I specify the start of each array (where index value = 1) and its length, which is not allowable under Windows 10.
MPI_Send takes as arguments (buffer, count, datatype, destination, tag, comm)
Where buffer is the initial address of the send buffer, in Fortran, this argument is a reference, thus
would specify the starting address (by reference) of the transfer.
*** If your version of MS MPI headers is such that the subroutine interface to MPI_Send is declared with the buffer as:
type(*), dimension(..), intent(in) :: buffer
Then you will have to qualify the range of indexes
call MPI_Send(YourArray(someIndex:someIndex+count-1), count, ...
or if always starting at index 1:
call MPI_Send(YourArray(1:count), count, ...
This then would be a case of you making your application source code conformant with the declared interface.
I think the change to dimension(..), thus requiring you to specify the array, or more specific array slice, is to force the compiler to generate a contiguous buffer of data in the event that the specified starting location of the specified buffer is not contiguous with the remainder of the buffer. For example when the array slice is a column of an array, or when the buffer is specified via a pointer with stride other than 1.
A bit of cleanup of your code may be all that is necessary.
Have you enabled -warn:interfaces?