| 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 |
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.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 364.1 | Try printing sp inside the loop | WIBBIN::NOYCE | Pulling weeds, pickin' stones | Tue Feb 04 1997 08:28 | 9 |
> 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.2 | Please Call KAI ... | HPCGRP::MANLEY | Tue Feb 04 1997 10:32 | 15 | |
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.3 | solution from KAI | RTOMS::PARETIJ | Tue Feb 04 1997 12:57 | 66 | |
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
| |||||