10
0
mirror of https://gitlab.com/scemama/irpf90.git synced 2024-12-21 11:53:32 +01:00

Improvements of parallel vepison

Version:1.1.49
This commit is contained in:
Anthony Scemama 2010-04-06 15:24:24 +02:00
parent f4d5322d15
commit c5ce9e88fd
9 changed files with 78 additions and 43 deletions

View File

@ -32,5 +32,11 @@ wd = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0,(wd+"/../src/"))
sys.path.insert(0,(wd+"/../share/irpf90/src/"))
import irpf90
irpf90.main()
debug = int(os.getenv("IRP_DEBUG",0))
if debug == 0:
import irpf90
irpf90.main()
else:
import profile
print "Profiling irpf90"
profile.run('import irpf90 ; irpf90.main()')

View File

@ -54,9 +54,11 @@ subroutine irp_enter(irp_where)
integer :: nthread
character*(*) :: irp_where
$OMP_DECL
!$OMP CRITICAL
ithread = $OMP_GET_THREAD_NUM
nthread = $OMP_GET_NUM_THREADS
$1
!$OMP END CRITICAL
"""
if command_line.do_memory:
txt+="""
@ -75,9 +77,11 @@ subroutine irp_leave (irp_where)
integer :: ithread
double precision :: cpu
$OMP_DECL
!$OMP CRITICAL
ithread = $OMP_GET_THREAD_NUM
$3
$4
!$OMP END CRITICAL
end subroutine
"""
@ -97,14 +101,12 @@ end subroutine
# $1
if do_assert or do_debug:
txt = txt.replace("$1","""
!$OMP CRITICAL
if (.not.alloc) then
allocate(irp_stack(STACKMAX,nthread))
allocate(irp_cpu(STACKMAX,nthread))
allocate(stack_index(nthread))
allocate(irp_stack(STACKMAX,nthread+1))
allocate(irp_cpu(STACKMAX,nthread+1))
allocate(stack_index(nthread+1))
alloc = .True.
endif
!$OMP END CRITICAL
stack_index(ithread+1) = stack_index(ithread+1)+1
irp_stack(stack_index(ithread+1),ithread+1) = irp_where""")
if command_line.do_memory:

View File

@ -24,6 +24,8 @@
# 31062 Toulouse Cedex 4
# scemama@irsamc.ups-tlse.fr
import sys
sys.setcheckinterval(1000)
def main():
from command_line import command_line

View File

@ -33,6 +33,7 @@ class Line(object):
def __init__(self,i,text,filename):
self.i = i
self.text = text
self.lower = text.lower()
self.filename = filename
class Empty_line(Line):

View File

@ -92,16 +92,25 @@ def run():
if m.is_main:
exe = m.name[:-4]
print >>file, "%s: %s%s.irp.o $(OBJ1)"%(exe,irpdir,exe)
print >>file, "\t$(FC) -o $@ %s$@.irp.o $(OBJ1) $(LIB)"%(irpdir)
print >>file, "\t@echo Linking %s"%(exe)
print >>file, "\t@$(FC) -o $@ %s$@.irp.o $(OBJ1) $(LIB)"%(irpdir)
print >>file, "\t@make -s move"
buffer = ""
for m in mod:
filename = "%s%s.irp.module:"%(irpdir,m.name[:-4])
mds = map (lambda x: " %s%s.irp.module"%(irpdir,x[:-4]),m.needed_modules)
print >>file, filename+" ".join(mds)
for m in mod:
filename = "%s%s.irp.o:"%(irpdir,m.name[:-4])
mds = map (lambda x: " %s%s.irp.o"%(irpdir,x[:-4]),m.needed_modules)
mds = map (lambda x: " %s%s.irp.module"%(irpdir,x[:-4]),m.needed_modules)
print >>file, filename+" ".join(mds)
if not m.is_main:
buffer += "\t - @echo '"+filename+" ".join(mds)+"' >> %sdist_Makefile\n"%(irpdir)
print >>file, "%sirp_touches.irp.module:"%(irpdir),
mds = filter(lambda x: not x.is_main,mod)
mds = map(lambda x: " %s%s.irp.module"%(irpdir,x.name[:-4]),mds)
print >>file," ".join(mds)
print >>file, "%sirp_touches.irp.o:"%(irpdir),
mds = filter(lambda x: not x.is_main,mod)
mds = map(lambda x: " %s%s.irp.o"%(irpdir,x.name[:-4]),mds)
@ -135,15 +144,22 @@ def run():
print >>file, "\t- @cp %s$*.irp.F90 dist/$*/| DO_NOTHING="%(irpdir)
print >>file, "\t- cd dist ; tar -zcvf ../$*.tar.gz $*\n"
print >>file, irpdir+"%.irp.o: "+irpdir+"%.irp.F90"
print >>file, "\t$(FC) $(FCFLAGS) -c "+irpdir+"$*.irp.F90 -o "+irpdir+"$*.irp.o"
print >>file, irpdir+"%.irp.module: "+irpdir+"%.irp.F90"
print >>file, "\t@echo Creating $* module"
print >>file, "\t@$(FC) -O0 -c "+irpdir+"$*.irp.F90 -o "+irpdir+"$*.irp.o"
print >>file, "\t@rm "+irpdir+"$*.irp.o"
print >>file, "\t@touch "+irpdir+"$*.irp.module"
print >>file, irpdir+"%.irp.o: "+irpdir+"%.irp.module"
print >>file, "\t@echo Compiling $*"
print >>file, "\t@$(FC) $(FCFLAGS) -c "+irpdir+"$*.irp.F90 -o "+irpdir+"$*.irp.o"
print >>file, irpdir+"%.o: %.F90"
print >>file, "\t$(FC) $(FCFLAGS) -c $*.F90 -o "+irpdir+"$*.o"
print >>file, "\t@echo Compiling $*"
print >>file, "\t@$(FC) $(FCFLAGS) -c $*.F90 -o "+irpdir+"$*.o"
print >>file, irpdir+"%.o: %.f90\n\t$(FC) $(FCFLAGS) -c $*.f90 -o "+irpdir+"$*.o"
print >>file, irpdir+"%.o: %.f\n\t$(FC) $(FCFLAGS) -c $*.f -o "+irpdir+"$*.o"
print >>file, irpdir+"%.o: %.F\n\t$(FC) $(FCFLAGS) -c $*.F -o "+irpdir+"$*.o"
print >>file, irpdir+"%.irp.F90: irpf90.make\n"
print >>file, "move:\n\t@mv -f *.mod IRPF90_temp/ 2> /dev/null | DO_NOTHING=\n"
print >>file, "move:\n\t@mv -f *.mod IRPF90_temp/ 2> /dev/null | DO_NOTHING=\n\t@touch IRPF90_temp/*\n"
print >>file, "clean:\n\trm -rf $(EXE) $(OBJ1) $(ALL_OBJ1) $(ALL)\n"
print >>file, "veryclean:\n\t- make clean\n"
print >>file, "\t- rm -rf "+irpdir+" "+mandir+" irpf90.make irpf90_variables dist\n"

View File

@ -37,6 +37,7 @@ vtuple = map(lambda v: (v, variables[v].same_as, variables[v].regexp), variables
stuple = map(lambda s: (s, subroutines[s].regexp), subroutines.keys())
stuple = filter(lambda s: subroutines[s[0]].is_function, stuple)
regexps_re_string_sub = regexps.re_string.sub
def find_variables_in_line(line):
assert isinstance(line,Line)
result = []
@ -45,7 +46,7 @@ def find_variables_in_line(line):
for v,same_as,regexp in vtuple:
if v in buffer:
if not sub_done:
buffer = regexps.re_string.sub('',buffer)
buffer = regexps_re_string_sub('',buffer)
sub_done = True
if regexp.search(buffer) is not None:
result.append(same_as)
@ -54,12 +55,13 @@ def find_variables_in_line(line):
def find_funcs_in_line(line):
assert isinstance(line,Line)
result = []
append = result.append
sub_done = False
buffer = line.text.lower()
for s,regexp in stuple:
if s in buffer:
if regexp.search(buffer) is not None:
result.append(s)
append(s)
return result
@ -90,6 +92,7 @@ def get_parsed_text():
varlist = []
for filename, text in preprocessed_text:
result = []
append = result.append
for line in filter(
lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
text):
@ -110,28 +113,28 @@ def get_parsed_text():
Function,
End,
]:
result.append( ([],line) )
append( ([],line) )
elif isinstance(line,End_provider):
varlist = []
result.append( ([],line) )
append( ([],line) )
elif isinstance(line,Provide):
l = line.text.lower().split()[1:]
l = filter(lambda x: x not in varlist, l)
for v in l:
if v not in variables.keys():
error.fail(line,"Variable %s is unknown"%(v))
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
elif isinstance(line,Call):
l = find_variables_in_line(line)
l = filter(lambda x: x not in varlist, l)
sub = find_subroutine_in_line(line)
if sub not in subroutines:
t = Simple_line
result.append( (l,Simple_line(line.i,line.text,line.filename)) )
append( (l,Simple_line(line.i,line.text,line.filename)) )
else:
result.append( (l,line) )
append( (l,line) )
if subroutines[sub].touches != []:
result.append( ([],Provide_all(line.i,"",line.filename)) )
append( ([],Provide_all(line.i,"",line.filename)) )
elif isinstance(line,Free):
vars = line.text.split()
if len(vars) < 2:
@ -139,7 +142,7 @@ def get_parsed_text():
vars = map(lower,vars[1:])
for v in vars:
variables[v].is_freed = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
use = map(lambda x: " use %s"%(variables[x].fmodule),vars)
for var in vars:
result += map(lambda x: ([],Use(line.i,x,line.filename)),
@ -148,10 +151,10 @@ def get_parsed_text():
variables[var].free)
elif isinstance(line,Irp_read):
variables[line.filename]._is_read = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
elif isinstance(line,Irp_write):
variables[line.filename]._is_written = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
elif isinstance(line,Touch):
vars = line.text.split()
if len(vars) < 2:
@ -197,11 +200,11 @@ def get_parsed_text():
except ValueError:
print v, variables[v].same_as
raise
result.append( (variable_list,line) )
append( (variable_list,line) )
else:
l = find_variables_in_line(line)
l = filter(lambda x: x not in varlist, l)
result.append( (l,line) )
append( (l,line) )
main_result.append( (filename, result) )
return main_result
@ -245,6 +248,7 @@ def move_variables():
main_result = []
for filename, text in parsed_text:
result = []
append = result.append
# 1st pass
varlist = []
ifvars = []
@ -257,20 +261,20 @@ def move_variables():
for vars,line in revtext:
if type(line) in [ End_provider,End ]:
varlist = []
result.append( ([],line) )
append( ([],line) )
elif type(line) in [ Endif, End_select ]:
old_ifvars.append( list(ifvars) )
old_elsevars.append( list(elsevars) )
old_varlist.append( list(varlist) )
varlist = []
result.append( ([],line) )
append( ([],line) )
elif type(line) == Else:
elsevars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
varlist = []
elif type(line) in [ Elseif, Case ]:
ifvars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
if vars != []:
varlist = old_varlist.pop()
varlist += vars
@ -278,29 +282,30 @@ def move_variables():
varlist = []
elif type(line) in [ If, Select ]:
ifvars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
vars += filter(lambda x: x in elsevars, ifvars)
ifvars = old_ifvars.pop()
elsevars = old_elsevars.pop()
varlist = old_varlist.pop() + vars
elif type(line) in [ Begin_provider, Subroutine, Function ]:
varlist += vars
result.append( (varlist,line) )
append( (varlist,line) )
if old_varlist != [] \
or old_ifvars != [] \
or old_elsevars != []:
error.fail(line,"End if missing")
varlist = []
elif isinstance(line,Provide_all):
result.append( (vars,line) )
append( (vars,line) )
else:
varlist += vars
result.append( ([],line) )
append( ([],line) )
result.reverse()
# 2nd pass
text = result
result = []
append = result.append
old_varlist = []
varlist = []
for vars,line in text:
@ -326,7 +331,7 @@ def move_variables():
elif type(line) in [ End_provider, End ]:
assert old_varlist == []
varlist = []
result.append( (vars,line) )
append( (vars,line) )
main_result.append( (filename, result) )
return main_result
@ -356,11 +361,12 @@ def add_subroutine_needs():
main_result = []
for filename, text in parsed_text:
result = []
append = result.append
for vars,line in text:
if isinstance(line,Call):
subname = find_subname(line)
vars = subroutines[subname].to_provide
result.append( (vars,line) )
append( (vars,line) )
main_result.append( (filename, result) )
return main_result

View File

@ -121,10 +121,11 @@ class Variable(object):
def others(self):
if '_others' not in self.__dict__:
result = []
append = result.append
f = lambda l: type(l) in [Begin_provider, Cont_provider]
lines = filter(f, self.text)
for line in lines:
result.append(line.filename[1])
append(line.filename[1])
result.remove(self.name)
self._others = result
return self._others

View File

@ -66,13 +66,14 @@ def call_provides(vars,opt=False):
all_children = flatten( map(lambda x: variables[x].children, vars ))
vars = filter(lambda x: x not in all_children,vars)
def fun(x):
result = []
if command_line.do_openmp:
result = [ "!$OMP TASK" ]
else:
result = []
result += [ "!$OMP TASK" ]
result += [ \
" if (.not.%s_is_built) then"%(x) ]
result += [ \
" call provide_%s"%(x) ]
result += [ \
" if (.not.%s_is_built) then"%(x),
" call provide_%s"%(x),
" endif" ]
if command_line.do_openmp:
result += [ "!$OMP END TASK" ]

View File

@ -1 +1 @@
version = "1.1.48"
version = "1.1.49"