From 3f2d536c65d1c558ed11abcf07fc1d8db110546f Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2011 23:18:17 +0200 Subject: [PATCH] Bugs --- src/irpf90.py | 8 ++++---- src/profile.py | 41 +++++++++++++++++++++++++---------------- src/variable.py | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/irpf90.py b/src/irpf90.py index e658eda..f863132 100644 --- a/src/irpf90.py +++ b/src/irpf90.py @@ -66,10 +66,6 @@ def main(): for x in parents: print "- %s"%(x,) - if command_line.do_profile: - import profile - profile.run() - if not command_line.do_run: return @@ -94,5 +90,9 @@ def main(): import create_man create_man.run() + if command_line.do_profile: + import profile + profile.run() + if __name__ == '__main__': main() diff --git a/src/profile.py b/src/profile.py index b28586d..23b00f8 100644 --- a/src/profile.py +++ b/src/profile.py @@ -1,18 +1,17 @@ #!/usr/bin/python rdtsc = """ -#define uint64_t unsigned long #ifdef __i386 -uint64_t irp_rdtsc_() { - uint64_t x; +double irp_rdtsc_(void) { + unsigned long long x; __asm__ volatile ("rdtsc" : "=A" (x)); - return x; + return (double) x; } #elif __amd64 -uint64_t irp_rdtsc_() { - uint64_t a, d; +double irp_rdtsc_(void) { + unsigned long long a, d; __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); - return (d<<32) | a; + return (double)((d<<32) | a); } #endif """ @@ -20,6 +19,7 @@ uint64_t irp_rdtsc_() { import subprocess import tempfile import os +import threading from variables import variables def build_rdtsc(): @@ -28,9 +28,13 @@ def build_rdtsc(): file = open(filename,'w') file.write(rdtsc) file.close() - p = subprocess.Popen(["gcc","-O3",filename,"-c","-o","IRPF90_temp/irp_rdtsc.o"]) - p.communicate() - os.remove(filename) + def t(): + p = subprocess.Popen(["gcc","-O2",filename,"-c","-o","IRPF90_temp/irp_rdtsc.o"]) + + p.communicate() + os.remove(filename) + + threading.Thread(target=t).start() def build_module(): data = """ @@ -50,20 +54,23 @@ subroutine irp_set_timer(i,value) use irp_timer implicit none integer, intent(in) :: i - integer*8, intent(in) :: value - irp_profile(1,i) = dble(value) - irp_profile(2,i) = irp_profile(2,i)+1.d0 + double precision, intent(in) :: value + irp_profile(1,i) = irp_profile(1,i) + value + irp_profile(2,i) = irp_profile(2,i) + 1.d0 end subroutine irp_print_timer() use irp_timer implicit none integer :: i - print '(16X,5(2X,A16))', 'Num Calls', 'Tot Cycles', 'Avge Cycles', & + print '(A24,A8,4(X,A14))', 'Calls', 'Tot Cycles', 'Avge Cycles', & 'Tot Secs(1GHz)', 'Avge Secs(1GHz)' + print '(A)', '----------------------------------------------'// & + '----------------------------------------------' do i=1,%(n)d if (irp_profile(2,i) > 0.) then - print '(A16,5(2X,F16.4))', irp_profile_label(i), irp_profile(2,i), & + print '(A24,F8.0,2(X,F14.0),2(X,F14.8))', & + irp_profile_label(i), irp_profile(2,i), & irp_profile(1,i), irp_profile(1,i)/irp_profile(2,i), & irp_profile(1,i)*1.d-9, 1.d-9*irp_profile(1,i)/irp_profile(2,i) endif @@ -75,11 +82,13 @@ end vi = variables[i] label[vi.label] = vi.name text = [] + lmax = 0 for l in label: text.append(" irp_profile_label(%d) = '%s'"%(l,label[l])) + lmax = max(lmax,l) text.sort() text = '\n'.join(text) - data = data%{'text': text, 'n':len(label.keys())} + data = data%{'text': text, 'n':lmax} file = open("IRPF90_temp/irp_profile.irp.F90",'w') file.write(data) file.close() diff --git a/src/variable.py b/src/variable.py index 351bfd0..591b523 100644 --- a/src/variable.py +++ b/src/variable.py @@ -558,7 +558,7 @@ class Variable(object): text.append( (vars,line) ) text += map( lambda x: ([],Simple_line(line.i,x,line.filename)), call_provides(vars) ) if command_line.do_profile and type(line) == Begin_provider: - text.append( ( [], Declaration(line.i," integer*8 :: irp_rdtsc, irp_rdtsc1, irp_rdtsc2",line.filename) ) ) + text.append( ( [], Declaration(line.i," double precision :: irp_rdtsc, irp_rdtsc1, irp_rdtsc2",line.filename) ) ) text.append( ( [], Simple_line(line.i," irp_rdtsc1 = irp_rdtsc()",line.filename) ) ) if type(line) == End_provider: if inside: