Something odd is definitely going on here. I'm able to replicate your problem with the intel compiler suite, but I can't quite figure out why -- it all works properly if I convert the app to C (and still use the MPI_REAL16 datatype with long double data).

George and I are investigating; I've opened a ticket on this: 
https://svn.open-mpi.org/trac/ompi/ticket/1603


On Oct 28, 2008, at 6:35 AM, Julien Devriendt wrote:


Yes point to point communication is OK with quad prec. and one-way reductions as well. I also tried my sample code on another platform (which sports AMD opterons instead of Intel CPUs) with the same compilers, and get the same *wrong* results with the call to MPI_ALLREDUCE in quad prec, so it does not seem to be a machine bug. Also altering a bit my sample code so as to replace MPI_SUM by MPI_MAX in the call to MPI_ALLREDUCE works perfectly well in quad prec !!!


On Tue, 28 Oct 2008, Terry Frankcombe wrote:

I assume you've confirmed that point to point communication works
happily with quad prec on your machine? How about one-way reductions?


On Tue, 2008-10-28 at 08:47 +0000, Julien Devriendt wrote:
Thanks for your suggestions.
I tried them all (declaring my variables as REAL*16 or REAL(16)) to no
avail. I still get the wrong answer with my call to MPI_ALLREDUCE.

I think the KINDs are compiler dependent. For Sun Studio Fortran, REAL*16 and REAL(16) are the same thing. For Intel, maybe it's different. I don't
know.  Try running this program:

double precision xDP
real(16) x16
real*16 xSTAR16
write(6,*) kind(xDP), kind(x16), kind(xSTAR16), kind(1.0_16)
end

and checking if the output matches your expectations.

Jeff Squyres wrote:

I dabble in Fortran but am not an expert -- is REAL(kind=16) the same as REAL*16? MPI_REAL16 should be a 16 byte REAL; I'm not 100% sure that
REAL(kind=16) is the same thing...?

On Oct 23, 2008, at 7:37 AM, Julien Devriendt wrote:

Hi,

I'm trying to do an MPI_ALLREDUCE with quadruple precision real and
MPI_SUM and open mpi does not give me the correct answer (vartemp
is equal to vartored instead of 2*vartored). Switching to double
precision
real works fine.
My version of openmpi is 1.2.7 and it has been compiled with ifort v10.1
and icc/icpc at installation

Here's the simple f90 code which fails:

program test_quad

  implicit none

  include "mpif.h"

  real(kind=16)             :: vartored(8),vartemp(8)
  integer                   :: nn,nslaves,my_index
  integer                   :: mpierror

  call MPI_INIT(mpierror)
  call MPI_COMM_SIZE(MPI_COMM_WORLD,nslaves,mpierror)
  call MPI_COMM_RANK(MPI_COMM_WORLD,my_index,mpierror)

  nn       = 8
  vartored = 1.0_16
  vartemp  = 0.0_16
  print*,"P1 ",my_index,vartored
  call  MPI_ALLREDUCE
(vartored,vartemp,nn,MPI_REAL16,MPI_SUM,MPI_COMM_WORLD,mpierror)
  print*,"P2 ",my_index,vartemp

  stop

end program test_quad

Any idea why this happens?

_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users

_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users

_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users

_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users


--
Jeff Squyres
Cisco Systems

Reply via email to