[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference nicctr::kap-users

Title:Kuck Associates Preprocessor Users
Notice:KAP V2.1 (f90,f77,C) SSB-kits - see note 2
Moderator:HPCGRP::DEGREGORY
Created:Fri Nov 22 1991
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:390
Total number of notes:1440

364.0. "help to GUIDE" by RTOMS::PARETIJ () Tue Feb 04 1997 09:39

The following [simplified ] code has to be parallelized with GUIDE
and it fails. Does anybody know why ?

/Joseph



-----------------------------------------------------------
To proceed with the max-planck project I need to
isolate a reference case where the serial code produces
exactly the same numbers as the parallel one. 

One modification
includes replacing the ran() function with an array that
gets assigned prior to the || region. This should work 
like the attached simplified code which calculates 
2 partial sums. Instead of using a do-loop I use a routine
that increments the index. This is analogous to Maxplank
as I don't know at the onset how many ran's are
needed (data dependent ).

The code herein does not produce repeatable data and it
sometimes fails due to an exception (presumably because the array
upper bound is exceeded) 


Can anybody see what's wrong with this ?

         real a(10)
       common /pointer/ jp
c$par instance parallel /pointer/
         integer ip,ul,ll
         do i=1,10
           a(i)= i*0.1+i*i*0.001
         end do
c
c   serial
         s1=0.0
         s2=0.0
         do i=1,5
           s1=s1+a(i)
         end do
c
         do i=6,10
           s2=s2+a(i)
         end do
c
         do i=1,10
           write(*,*)'i,a ',i,a(i)
         end do
         write(*,*)
         write(*,*)'serial s[1-5],s[6-10]',s1,s2
         write(*,*)
         write(*,*)
c
c parallel
          sp =0.0
c$par parallel
c$par&  local(sp,ip,ul,ll)
c$par&  shared(a)
        if (mppnth() .ne. 2 ) then
          write(*,*)' this only works with 2 threads '
          stop
        else
           if (mpptid() .eq. 0) then
              jp = 0
           else
              jp = 5
           end if
        ll     = mpptid()*5+1
        ul     = ll+4
      write(*,*)'setup-th ',mpptid(),' ll,ul,in-jp ',ll,ul,jp
         do while (jp .ge. ll .and. jp .le. ul)
            call increment
            sp=sp+a(jp)
            write(*,*)'s-loop-th',mpptid(),'jp,a',jp,a(jp)
         end do
        end if
 5        write(*,*)' message from th ',mpptid(),'sum =',sp
c$par end parallel
        end
       subroutine increment
       common /pointer/ jp
c$par instance parallel /pointer/
       jp=jp+1
       return
       end




rawhide.rto.dec.com> a.out
 serial s1,s2   1.555000       4.330000
 setup-th           0ll,ul           1           5
 s-loop-th           0jp,a           6  0.6360000
  message from th            0sum =  0.6360000
 setup-th           1ll,ul           6          10
 s-loop-th           1jp,a           7  0.7490000
 s-loop-th           1jp,a           8  0.8640000
 s-loop-th           1jp,a           9  0.9810001
 s-loop-th           1jp,a          10   1.100000
forrtl: error (65): floating invalid
Abort process (core dumped)
rawhide.rto.dec.com>
T.RTitleUserPersonal
Name
DateLines
364.1Try printing sp inside the loopWIBBIN::NOYCEPulling weeds, pickin' stonesTue Feb 04 1997 11:289
>	c
>	c parallel
>	          sp =0.0
>	c$par parallel
>	c$par&  local(sp,ip,ul,ll)
>	c$par&  shared(a)

Don't you want to initialize (the local variable) sp *inside*
the parallel region, so that each thread's copy starts at 0.0?
364.2Please Call KAI ...HPCGRP::MANLEYTue Feb 04 1997 13:3215
Joseph,

> The following [simplified ] code has to be parallelized with GUIDE
> and it fails. Does anybody know why ?

While it was very kind of Bill to offer a (quite likely correct) suggestion
in .1, GUIDE is not a Digital Distributed product and is not supported by
Digital. Please refer all further GUIDE questions directly to Kuck and
Associates, Inc. Thanks.

Best Regards,

	- Dwight -

364.3solution from KAIRTOMS::PARETIJTue Feb 04 1997 15:5766
The main problem in 364.0 is that the common /pointer/ gets
declared but not allocated. (there are also a couple of bugs 
on the loop limits )
Here follows the correct one :
Thanks for your help
--------------------
         real a(10)
       common /pointer/ jp
c$par instance parallel /pointer/
         integer ip,ul,ll
         do i=1,10
           a(i)= i*0.1+i*i*0.001
         end do
c
c   serial
         s1=0.0
         s2=0.0
         do i=1,5
           s1=s1+a(i)
         end do
c
         do i=6,10
           s2=s2+a(i)
         end do
c
         do i=1,10
           write(*,*)'i,a ',i,a(i)
         end do
         write(*,*)
         write(*,*)'serial s[1-5],s[6-10]',s1,s2
         write(*,*)
         write(*,*)
c
c parallel
          sp =0.0
c$par parallel
c$par&  local(sp,ip,ul,ll)
c$par&  shared(a)
C$PAR NEW /POINTER/
        if (mppnth() .ne. 2 ) then
          write(*,*)' this only works with 2 threads '
          stop
        else   
           if (mpptid() .eq. 0) then
              jp = 0
           else
              jp = 5
           end if
        ll     = mpptid()*5 
        ul     = ll+4
      write(*,*)'setup-th ',mpptid(),' ll,ul,in-jp ',ll,ul,jp
         do while (jp .ge. ll .and. jp .le. ul) 
            call increment
            sp=sp+a(jp)
            write(*,*)'s-loop-th',mpptid(),'jp,a',jp,a(jp)
         end do
        end if
 5        write(*,*)' message from th ',mpptid(),'sum =',sp
c$par end parallel
        end 
       subroutine increment
       common /pointer/ jp
c$par instance parallel /pointer/
       jp=jp+1
       return
       end