Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] MPI_SUM and MPI_REAL16 with MPI_ALLREDUCE in fortran90
From: Julien Devriendt (jeg_at_[hidden])
Date: 2008-10-28 06:35:12


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
>>> users_at_[hidden]
>>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>>>
>> _______________________________________________
>> users mailing list
>> users_at_[hidden]
>> http://www.open-mpi.org/mailman/listinfo.cgi/users
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users
>