[mpich-discuss] MPI 64 bit for 64 bit code on windows7 64 bit
Jayesh Krishna
jayesh at mcs.anl.gov
Tue Sep 25 10:51:56 CDT 2012
Hi,
If you can give us a simple test case that shows the problem it would be useful (The smallest fortran program, test.f, that compiles and shows the problem).
(PS: A couple of lines of fortran code that shows the problem is what we need.)
Regards,
Jayesh
----- Original Message -----
From: "Marco De Gregorio" <marco.degregorio at iet.unipi.it>
To: "Jayesh Krishna" <jayesh at mcs.anl.gov>
Cc: mpich-discuss at mcs.anl.gov
Sent: Tuesday, September 25, 2012 7:01:35 AM
Subject: Re: [mpich-discuss] MPI 64 bit for 64 bit code on windows7 64 bit
Hi,
I am sorry, but I don't understand. Do you want to see my code?
I can copy a subroutine with error if it is useful.
However, the program test fpi work well.
This is the subroutine:
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SUBROUTINE Build_MPI_near_field_type(var_name,MY_MPI_near_field_type)
!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
TYPE(near_field_var), INTENT(IN) :: var_name
INTEGER, INTENT(IN) :: MY_MPI_near_field_type
INTEGER, PARAMETER :: SIZE = 4
INTEGER(KIND = MPI_ADDRESS_KIND) :: address(SIZE)
INTEGER(KIND = MPI_ADDRESS_KIND) :: displs(SIZE)
INTEGER :: type_list(SIZE), block_lenghts(SIZE), MY_MPI_error
!generate type_list
type_list(1) = MPI_REAL
type_list(2) = MPI_REAL
type_list(3) = MPI_REAL
type_list(4) = MPI_INTEGER
! in the 64bit version, after last MPI_GET_ADDRESS it change
!the value of block_lenghts(1) in -1. I moved it under
!Fill block_lengths
!block_lenghts(:) = 1
!get addresses
CALL MPI_GET_ADDRESS(var_name%distance,address(1),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%min_distance,address(2),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%max_distance,address(3),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%flag,address(4),MY_MPI_error)
!Compute displacement
displs(1) = 0
displs(2) = address(2) - address(1)
displs(3) = address(3) - address(1)
displs(4) = address(4) - address(1)
WRITE (*,*) MPI_ADDRESS_KIND
!Fill block_lengths
block_lenghts(:) = 1
CALL MPI_TYPE_CREATE_STRUCT(SIZE,block_lenghts,displs,type_list,MY_MPI_near_field_type,MY_MPI_error)
CALL MPI_TYPE_COMMIT(MY_MPI_near_field_type,MY_MPI_error)
END SUBROUTINE
This is the call in other sub:
!Near field (for sparfied matrix)
CALL Build_MPI_near_field_type(var_name%near_field,MY_MPI_near_field_type)
I defined
TYPE(project_var), INTENT(IN) :: var_name
INTEGER, INTENT(IN) :: MY_MPI_near_field_type
Where in a module I defined:
TYPE :: project_var
TYPE(near_field_var) :: near_field
TYPE(ground_var) :: ground
...
END TYPE project_var
and
TYPE :: near_field_var
REAL(KIND=SGL) :: distance, min_distance, max_distance
INTEGER :: flag
END TYPE near_field_var
In another module:
INTEGER, PARAMETER :: SGL = SELECTED_REAL_KIND(p=6,r=37)
p.s. of course. The 64 bit code doesn't work with 32 bit MPICH2, the builder returned error in link procedure.
Ing. Marco De Gregorio
Microwave & Radiation Laboratory
Dip. Ingegneria dell'Informazione - Università di Pisa
via G. Caruso 16, 56122 Pisa - Italy
Lab : (+39)050.2217681
Cell : (+39)3281982575
Mail : marco.degregorio at iet.unipi.it
2012/9/24 Jayesh Krishna < jayesh at mcs.anl.gov >
Hi,
Can you send us a test program (source code) that fails?
(PS: I am assuming that you recompiled your code after installing the 64-bit libs.)
Regards,
Jayesh
----- Original Message -----
From: "Marco De Gregorio" < marco.degregorio at iet.unipi.it >
To: mpich-discuss at mcs.anl.gov
Sent: Monday, September 24, 2012 11:21:46 AM
Subject: [mpich-discuss] MPI 64 bit for 64 bit code on windows7 64 bit
Hi,
I work with a Fortran code. I use Visual Studio 2008 and Intel Fortran 11.
I have always used 32 bit MPI successfully.
Now I need to switch my code to 64 bit. First of all I uninstalled 32 bit MPICH2 and I installed mpich2-1.4.1p1-win-x86-64.
I have several problems.
When I launch my program, the first value of some integer array ( block_lengths ) changes sign after some MPI_GET_ADDRESS and I have an error message. Below you can find a piece of code.
block_lengths(:) = 1
!get addresses
CALL MPI_GET_ADDRESS(var_name%distance,address(1),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%min_distance,address(2),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%max_distance,address(3),MY_MPI_error)
CALL MPI_GET_ADDRESS(var_name%flag,address(4),MY_MPI_error)
So, I changed the position of these arrays in the code and I have bypass the error, but after the change, however the code doesn't work. The problem is with a mpi_send and mpi_receiver.
address is defined as INTEGER(KIND = MPI_ADDRESS_KIND) :: address(SIZE) , but write(*,*) MPI_GET_ADDRESS returns 4.
In the mpif.h I found:
INTEGER MPI_ADDRESS_KIND, MPI_OFFSET_KIND
PARAMETER (MPI_ADDRESS_KIND=8)
PARAMETER (MPI_OFFSET_KIND=8)
There is a mistake.
Do you have any idea to help me??
With 32 bit MPICH2 and 32 bit code I don't have error.
If I try mpiexec -n 1 code_64bit.exe , the 64 bit code works fine.
Thank you,
regards,
--
Ing. Marco De Gregorio
Microwave & Radiation Laboratory
Dip. Ingegneria dell'Informazione - Università di Pisa
via G. Caruso 16, 56122 Pisa - Italy
Lab: (+39)050.2217681
Mail: marco.degregorio at iet.unipi.it
_______________________________________________
mpich-discuss mailing list mpich-discuss at mcs.anl.gov
To manage subscription options or unsubscribe:
https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss
More information about the mpich-discuss
mailing list