From 0a9d085875bf01921c846490b261dd3e1516722b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 16 May 2011 17:00:18 +0200 Subject: [PATCH 1/4] Bug Version:1.1.71 --- src/touches.py | 5 +---- src/version.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/touches.py b/src/touches.py index 58c1c2b..4250e38 100644 --- a/src/touches.py +++ b/src/touches.py @@ -43,10 +43,7 @@ def create(): if out != []: out = map(lambda x: "%s\n"%(x),out) else: - out = """ - subroutine irpf90_dummy_touch() - end - """.splitlines() + out = ["subroutine irpf90_dummy_touch()\n", "end\n"] if not same_file(FILENAME,out): file = open(FILENAME,'w') file.writelines(out) diff --git a/src/version.py b/src/version.py index 11ff4d0..a4ec02e 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.70" +version = "1.1.71" From 3289431ca86bed532fee9e115d7680eee89554a9 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 26 May 2011 11:14:48 +0200 Subject: [PATCH 2/4] OpenMP nested locks Version:1.1.72 --- src/irpf90.py | 4 ++++ src/makefile.py | 62 ++++++++++++++++++++++++++++--------------------- src/variable.py | 54 +++++++++++++++++++++++++++++++++++------- src/version.py | 2 +- 4 files changed, 87 insertions(+), 35 deletions(-) diff --git a/src/irpf90.py b/src/irpf90.py index 57f4af6..1fca59a 100644 --- a/src/irpf90.py +++ b/src/irpf90.py @@ -87,6 +87,10 @@ def main(): import touches touches.create() + if command_line.do_openmp: + import locks + locks.create() + import create_man create_man.run() diff --git a/src/makefile.py b/src/makefile.py index 02d1631..7cdcef8 100644 --- a/src/makefile.py +++ b/src/makefile.py @@ -27,6 +27,7 @@ import os,sys import irpf90_t +from command_line import command_line irpdir = irpf90_t.irpdir mandir = irpf90_t.mandir @@ -70,6 +71,8 @@ def run(): result = "SRC += %sirp_stack.irp.F90"%(irpdir) result += " %sirp_touches.irp.F90"%(irpdir) + if command_line.do_openmp: + result += " %sirp_locks.irp.F90"%(irpdir) for m in mod: result += " %s%s.irp.F90"%(irpdir,m.name[:-4]) result += " %s%s.irp.module.F90"%(irpdir,m.name[:-4]) @@ -82,7 +85,11 @@ def run(): result += " %s%s.irp.module.o"%(irpdir,m.name[:-4]) print >>file, result - print >>file, "OBJ1 = $(patsubst %%, %s%%,$(notdir $(OBJ))) %sirp_touches.irp.o"%(irpdir,irpdir) + print >>file, "OBJ1 = $(patsubst %%, %s%%,$(notdir $(OBJ))) %sirp_touches.irp.o"%(irpdir,irpdir), + if command_line.do_openmp: + print >>file, " %sirp_locks.irp.o"%(irpdir) + else: + print >>file, "" all = filter(lambda x: modules[x].is_main, modules) all = map(lambda x: x[:-6], all) @@ -110,34 +117,37 @@ def run(): mds = filter(lambda x: not x.is_main,mod) mds = map(lambda x: " %s%s.irp.o %s%s.irp.o"%(irpdir,x.name[:-4],irpdir,x.name[:-4]),mds) print >>file," ".join(mds) + if command_line.do_openmp: + print >>file, "%sirp_locks.irp.o:"%(irpdir), + print >>file," ".join(mds) - print >>file, "%sdist_Makefile:"%(irpdir) - print >>file, "\t- @echo FC=$(FC) > %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo FCFLAGS=$(FCFLAGS) >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo LIB=$(LIB) >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo .DEFAULT_GOAL: exe >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo 'exe: $$(EXE).irp.F90 $(OBJ) irp_touches.irp.o' >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo '\t$$(FC) -o $$(EXE) $$(EXE).irp.F90 $(OBJ) irp_touches.irp.o $$(LIB)' >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo '%%.o: %%.F90' >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo '\t$$(FC) $$(FCFLAGS) -c $$*.F90 -o $$*.o' >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo 'clean:' >> %sdist_Makefile"%(irpdir) - print >>file, "\t- @echo '\trm *.o *.mod $$(EXE) 2>/dev/null' >> %sdist_Makefile"%(irpdir) - print >>file, buffer - print >>file, "\t- @echo '\tirp_touches.irp.o: irp_touches.irp.F90 $(OBJ) >> %sdist_Makefile"%(irpdir) +# print >>file, "%sdist_Makefile:"%(irpdir) +# print >>file, "\t- @echo FC=$(FC) > %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo FCFLAGS=$(FCFLAGS) >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo LIB=$(LIB) >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo .DEFAULT_GOAL: exe >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo 'exe: $$(EXE).irp.F90 $(OBJ) irp_touches.irp.o' >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo '\t$$(FC) -o $$(EXE) $$(EXE).irp.F90 $(OBJ) irp_touches.irp.o $$(LIB)' >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo '%%.o: %%.F90' >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo '\t$$(FC) $$(FCFLAGS) -c $$*.F90 -o $$*.o' >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo 'clean:' >> %sdist_Makefile"%(irpdir) +# print >>file, "\t- @echo '\trm *.o *.mod $$(EXE) 2>/dev/null' >> %sdist_Makefile"%(irpdir) +# print >>file, buffer +# print >>file, "\t- @echo '\tirp_touches.irp.o: irp_touches.irp.F90 $(OBJ) >> %sdist_Makefile"%(irpdir) - print >>file, "%%.dist: %sdist_Makefile"%(irpdir) - print >>file, "\t- @mkdir -p dist/$*| DO_NOTHING=" - print >>file, "\t- @cp %s* dist/$*/| DO_NOTHING="%(irpdir) - print >>file, "\t- @for i in $(ALL) $(OBJ) irp_touches.irp.o $(ALL_OBJ); do rm dist/$*/$$i ; done| DO_NOTHING=" - print >>file, "\t- @for i in $(ALL) ; do rm dist/$*/$$i.irp.F90 ; done| DO_NOTHING=" - print >>file, "\t- @rm dist/$*/{*.irp.f,*.mod,irpf90_entities}| DO_NOTHING=" - print >>file, "\t- @rm dist/$*/*.mod 2>/dev/null| DO_NOTHING=" - print >>file, "\t- @echo 'EXE = $*' > dist/$*/Makefile| DO_NOTHING=" - print >>file, "\t- @cat dist/$*/dist_Makefile >> dist/$*/Makefile| DO_NOTHING=" - print >>file, "\t- @rm dist/$*/dist_Makefile| DO_NOTHING=" - print >>file, "\t- @cp %s$*.irp.F90 dist/$*/| DO_NOTHING="%(irpdir) - print >>file, "\t- cd dist ; tar -zcvf ../$*.tar.gz $*\n" +# print >>file, "%%.dist: %sdist_Makefile"%(irpdir) +# print >>file, "\t- @mkdir -p dist/$*| DO_NOTHING=" +# print >>file, "\t- @cp %s* dist/$*/| DO_NOTHING="%(irpdir) +# print >>file, "\t- @for i in $(ALL) $(OBJ) irp_touches.irp.o $(ALL_OBJ); do rm dist/$*/$$i ; done| DO_NOTHING=" +# print >>file, "\t- @for i in $(ALL) ; do rm dist/$*/$$i.irp.F90 ; done| DO_NOTHING=" +# print >>file, "\t- @rm dist/$*/{*.irp.f,*.mod,irpf90_entities}| DO_NOTHING=" +# print >>file, "\t- @rm dist/$*/*.mod 2>/dev/null| DO_NOTHING=" +# print >>file, "\t- @echo 'EXE = $*' > dist/$*/Makefile| DO_NOTHING=" +# print >>file, "\t- @cat dist/$*/dist_Makefile >> dist/$*/Makefile| DO_NOTHING=" +# print >>file, "\t- @rm dist/$*/dist_Makefile| DO_NOTHING=" +# 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.module.o: "+irpdir+"%.irp.module.F90" print >>file, "\t$(FC) $(FCFLAGS) -c "+irpdir+"$*.irp.module.F90 -o "+irpdir+"$*.irp.module.o" diff --git a/src/variable.py b/src/variable.py index 0fc61b4..7b2e847 100644 --- a/src/variable.py +++ b/src/variable.py @@ -266,6 +266,44 @@ class Variable(object): return self._toucher toucher = property(toucher) + ########################################################## + def locker(self): + if '_locker' not in self.__dict__: + if not command_line.do_openmp: + self._locker = [] + else: + from modules import modules + from variables import variables + name = self.name + result = [ "subroutine irp_lock_%s(set)"%(name) ] + result += [ " use omp_lib", + " implicit none", + " logical, intent(in) :: set", + " integer(kind=omp_nest_lock_kind),save :: %s_lock"%(name), + " integer,save :: ifirst", + ] + if command_line.do_debug: + length = str(len("irp_lock_%s"%(name))) + result += [ " character*(%s) :: irp_here = 'irp_lock_%s'"%(length,name), + " call irp_enter(irp_here)" ] + result += [ " if (ifirst == 0) then", + " ifirst = 1", + " call omp_init_nest_lock(%s_lock)"%(name), + " endif", + " if (set) then", + " call omp_set_nest_lock(%s_lock)"%(name), + " else", + " call omp_unset_nest_lock(%s_lock)"%(name), + " endif", + ] + if command_line.do_debug: + result.append(" call irp_leave(irp_here)") + result.append("end subroutine irp_lock_%s"%(name)) + result.append("") + self._locker = result + return self._locker + locker = property(locker) + ########################################################## def reader(self): if '_reader' not in self.__dict__: @@ -469,20 +507,20 @@ class Variable(object): " character*(%d) :: irp_here = 'provide_%s'"%(length,name), " integer :: irp_err ", " logical :: irp_dimensions_OK" ] + if command_line.do_openmp: + result.append(" call irp_lock_%s(.True.)"%(same_as)) if command_line.do_assert or command_line.do_debug: result.append(" call irp_enter(irp_here)") result += call_provides(self.to_provide) result += flatten( map(build_alloc,[self.same_as]+self.others) ) - if command_line.do_openmp: - result += [ "!$OMP CRITICAL (%s_critical)"%(same_as) ] - result += [ " if (.not.%s_is_built) then"%(same_as) ] - result += [ " call bld_%s"%(same_as) ] - result += [ " %s_is_built = .True."%(same_as), "" ] - if command_line.do_openmp: - result += [ " endif" ] - result += [ "!$OMP END CRITICAL (%s_critical)"%(same_as) ] + result += [ " if (.not.%s_is_built) then"%(same_as), + " call bld_%s"%(same_as), + " %s_is_built = .True."%(same_as), "" ] + result += [ " endif" ] if command_line.do_assert or command_line.do_debug: result.append(" call irp_leave(irp_here)") + if command_line.do_openmp: + result.append(" call irp_lock_%s(.False.)"%(same_as)) result.append("end subroutine provide_%s"%(name) ) result.append("") self._provider = result diff --git a/src/version.py b/src/version.py index a4ec02e..be628bc 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.71" +version = "1.1.72" From b4e93c05da92819dc2f828b8f75ac7700a437be1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 1 Jun 2011 15:36:04 +0200 Subject: [PATCH 3/4] Added irp_id and deallocate array upon termination Version:1.1.73 --- src/irpf90.py | 4 ---- src/irpf90_t.py | 3 +++ src/module.py | 1 + src/touches.py | 16 ++++++++++++++-- src/version.py | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/irpf90.py b/src/irpf90.py index 1fca59a..57f4af6 100644 --- a/src/irpf90.py +++ b/src/irpf90.py @@ -87,10 +87,6 @@ def main(): import touches touches.create() - if command_line.do_openmp: - import locks - locks.create() - import create_man create_man.run() diff --git a/src/irpf90_t.py b/src/irpf90_t.py index 9af0fe1..b43ca09 100644 --- a/src/irpf90_t.py +++ b/src/irpf90_t.py @@ -24,9 +24,12 @@ # 31062 Toulouse Cedex 4 # scemama@irsamc.ups-tlse.fr +import os +from zlib import crc32 irpdir = "IRPF90_temp/" mandir = "IRPF90_man/" +irp_id = crc32(os.getcwd()) class Line(object): diff --git a/src/module.py b/src/module.py index 01c945d..2eb6a36 100644 --- a/src/module.py +++ b/src/module.py @@ -191,6 +191,7 @@ class Fmodule(object): if command_line.do_openmp: temp += [ "!$OMP END MASTER" ] temp += [ "!$OMP END PARALLEL" ] + temp += [ " call irp_finalize_%s()"%(irp_id) ] temp += [ "end program" ] result = temp + result self._residual_text = result diff --git a/src/touches.py b/src/touches.py index 4250e38..1f97110 100644 --- a/src/touches.py +++ b/src/touches.py @@ -28,6 +28,7 @@ from irpf90_t import * from util import * from variables import variables +from modules import modules FILENAME=irpdir+'irp_touches.irp.F90' @@ -35,15 +36,26 @@ def create(): out = [] l = variables.keys() l.sort + finalize = "subroutine irp_finalize_%s\n"%(irp_id) + for m in filter(lambda x: not modules[x].is_main, modules): + finalize += " use %s\n"%(modules[m].name) for v in l: var = variables[v] if var.is_touched: out += var.toucher + var2 = variables[v] + if var2.dim != []: + finalize += " if (allocated(%s)) then\n"%v + finalize += " deallocate(%s)\n"%v + finalize += " endif\n" + finalize += "end\n" + if out != []: out = map(lambda x: "%s\n"%(x),out) - else: - out = ["subroutine irpf90_dummy_touch()\n", "end\n"] + + out += finalize + if not same_file(FILENAME,out): file = open(FILENAME,'w') file.writelines(out) diff --git a/src/version.py b/src/version.py index be628bc..7a89884 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.72" +version = "1.1.73" From 57707b39229c9adf09796e88b5993943b5491dfb Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 1 Jun 2011 16:56:56 +0200 Subject: [PATCH 4/4] irp_finalize Version:1.1.74 --- src/touches.py | 4 ++-- src/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/touches.py b/src/touches.py index 1f97110..d6c534c 100644 --- a/src/touches.py +++ b/src/touches.py @@ -43,9 +43,9 @@ def create(): var = variables[v] if var.is_touched: out += var.toucher - var2 = variables[v] - if var2.dim != []: + if var.dim != []: finalize += " if (allocated(%s)) then\n"%v + finalize += " %s_is_built = .False.\n"%var.same_as finalize += " deallocate(%s)\n"%v finalize += " endif\n" finalize += "end\n" diff --git a/src/version.py b/src/version.py index 7a89884..91e96cd 100644 --- a/src/version.py +++ b/src/version.py @@ -1 +1 @@ -version = "1.1.73" +version = "1.1.74"