1
1
2
- struct Timing
3
- ns:: UInt
2
+ struct Timing{T <: Number }
3
+ ns:: T
4
4
end
5
5
6
- function Base.:- (a:: Timing ,b:: Timing )
6
+ function Base.:- (a:: Timing{T} ,b:: Timing{T} ) where {T}
7
7
ns = a. ns- b. ns
8
8
Timing (ns)
9
9
end
10
10
11
11
@inline Timing () = Timing (time_ns ())
12
+ Timing (:: AbstractPData )= Timing ()
13
+ function Timing (:: MPIData )
14
+ Timing (MPI. Wtime ())
15
+ end
12
16
13
- mutable struct PTimer{A,B<: Dict }
17
+ mutable struct PTimer{A,B<: Dict ,C }
14
18
parts:: A
15
19
timings:: B
16
- current:: Timing
20
+ current:: Timing{C}
17
21
verbose:: Bool
18
22
end
19
23
24
+ function _to_secs (:: PTimer ,t:: Timing )
25
+ Float64 (t. ns)/ 1.0e9
26
+ end
27
+
28
+ function _to_secs (:: PTimer{<:MPIData} ,t:: Timing )
29
+ t. ns
30
+ end
31
+
20
32
function PTimer (parts:: AbstractPData{<:Integer} ;verbose:: Bool = false )
21
- current = Timing ()
33
+ current = Timing (parts )
22
34
timing = map_parts (p-> current,parts)
23
35
T = typeof (timing)
24
36
timings = Dict {String,T} ()
@@ -35,7 +47,7 @@ function Base.getproperty(t::PTimer, sym::Symbol)
35
47
for (name,timing) in t. timings
36
48
timing_main = gather (timing)
37
49
map_main (timing_main,data) do part_to_timing,data
38
- ns = map (i-> Float64 (i . ns) / 1.0e9 ,part_to_timing)
50
+ ns = map (i-> _to_secs (t,i) ,part_to_timing)
39
51
d = (min= minimum (ns),max= maximum (ns),avg= sum (ns)/ length (ns))
40
52
data[name] = d
41
53
end
@@ -50,21 +62,28 @@ function Base.propertynames(x::PTimer, private=false)
50
62
(fieldnames (typeof (x))... ,:data )
51
63
end
52
64
53
- function tic! (t:: PTimer )
54
- t. current = Timing ()
65
+ function tic! (t:: PTimer ;barrier= false )
66
+ t. current = Timing (t. parts)
67
+ end
68
+
69
+ function tic! (t:: PTimer{<:MPIData} ;barrier= false )
70
+ if barrier
71
+ MPI. Barrier (t. parts. comm)
72
+ end
73
+ t. current = Timing (t. parts)
55
74
end
56
75
57
76
function toc! (t:: PTimer ,name:: String )
58
- current = Timing ()
77
+ current = Timing (t . parts )
59
78
dt = current- t. current
60
79
timing = map_parts (p-> dt,t. parts)
61
80
t. timings[name] = timing
62
81
if t. verbose == true
63
82
map_main (timing) do i
64
- println (" [$(lstrip (_nice_time (Float64 (i . ns) / 1.0e9 ))) s in MAIN] $name " )
83
+ println (" [$(lstrip (_nice_time (_to_secs (t,i) ))) s in MAIN] $name " )
65
84
end
66
85
end
67
- t. current = Timing ()
86
+ t. current = Timing (t . parts )
68
87
end
69
88
70
89
function Base. show (io:: IO ,k:: MIME"text/plain" ,t:: PTimer )
@@ -127,4 +146,3 @@ function _print_footer(io,longest_name,w,linechars)
127
146
header_w = longest_name+ 3 * w
128
147
println (io,rule^ header_w)
129
148
end
130
-
0 commit comments