2011-09-30 19:10:18 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
rdtsc = """
|
|
|
|
#define uint64_t unsigned long
|
2011-09-30 21:46:08 +02:00
|
|
|
#ifdef __i386
|
2011-09-30 19:10:18 +02:00
|
|
|
uint64_t irp_rdtsc_() {
|
|
|
|
uint64_t x;
|
|
|
|
__asm__ volatile ("rdtsc" : "=A" (x));
|
|
|
|
return x;
|
|
|
|
}
|
2011-09-30 21:46:08 +02:00
|
|
|
#elif __amd64
|
2011-09-30 19:10:18 +02:00
|
|
|
uint64_t irp_rdtsc_() {
|
|
|
|
uint64_t a, d;
|
|
|
|
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
|
|
|
|
return (d<<32) | a;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
"""
|
|
|
|
|
|
|
|
import subprocess
|
|
|
|
import tempfile
|
|
|
|
import os
|
|
|
|
from variables import variables
|
|
|
|
|
|
|
|
def build_rdtsc():
|
|
|
|
file,filename = tempfile.mkstemp()
|
|
|
|
filename += ".c"
|
|
|
|
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 build_module():
|
|
|
|
data = """
|
|
|
|
module irp_timer
|
|
|
|
double precision :: irp_profile(2,%(n)d)
|
|
|
|
character*(64) :: irp_profile_label(%(n)d)
|
|
|
|
end module
|
|
|
|
|
|
|
|
subroutine irp_init_timer
|
|
|
|
use irp_timer
|
|
|
|
implicit none
|
|
|
|
irp_profile = 0.
|
|
|
|
%(text)s
|
|
|
|
end
|
|
|
|
|
|
|
|
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
|
|
|
|
end
|
|
|
|
|
|
|
|
subroutine irp_print_timer()
|
|
|
|
use irp_timer
|
|
|
|
implicit none
|
|
|
|
integer :: i
|
|
|
|
print '(16X,5(2X,A16))', 'Num Calls', 'Tot Cycles', 'Avge Cycles', &
|
|
|
|
'Tot Secs(1GHz)', 'Avge Secs(1GHz)'
|
|
|
|
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), &
|
|
|
|
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
|
|
|
|
enddo
|
|
|
|
end
|
|
|
|
"""
|
|
|
|
label = {}
|
|
|
|
for i in variables:
|
|
|
|
vi = variables[i]
|
|
|
|
label[vi.label] = vi.name
|
|
|
|
text = []
|
|
|
|
for l in label:
|
|
|
|
text.append(" irp_profile_label(%d) = '%s'"%(l,label[l]))
|
|
|
|
text.sort()
|
|
|
|
text = '\n'.join(text)
|
|
|
|
data = data%{'text': text, 'n':len(label.keys())}
|
|
|
|
file = open("IRPF90_temp/irp_profile.irp.F90",'w')
|
|
|
|
file.write(data)
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
def run():
|
|
|
|
build_module()
|
|
|
|
build_rdtsc()
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
build_rdtsc()
|