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 04:53:03


Sorry, forgot to mention that running your sample program with ifort
produces the expected result:

8 16 16 16

> 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
>