@@ -98,6 +98,9 @@ struct DataDepsAliasingState
98
98
ainfos_readers:: Dict{AbstractAliasing,Vector{Pair{DTask,Int}}}
99
99
ainfos_overlaps:: Dict{AbstractAliasing,Set{AbstractAliasing}}
100
100
101
+ # Cache ainfo lookups
102
+ ainfo_cache:: Dict{Tuple{Any,Any},AbstractAliasing}
103
+
101
104
function DataDepsAliasingState ()
102
105
data_origin = Dict {AbstractAliasing,MemorySpace} ()
103
106
data_locality = Dict {AbstractAliasing,MemorySpace} ()
@@ -106,8 +109,11 @@ struct DataDepsAliasingState
106
109
ainfos_readers = Dict {AbstractAliasing,Vector{Pair{DTask,Int}}} ()
107
110
ainfos_overlaps = Dict {AbstractAliasing,Set{AbstractAliasing}} ()
108
111
112
+ ainfo_cache = Dict {Tuple{Any,Any},AbstractAliasing} ()
113
+
109
114
return new (data_origin, data_locality,
110
- ainfos_owner, ainfos_readers, ainfos_overlaps)
115
+ ainfos_owner, ainfos_readers, ainfos_overlaps,
116
+ ainfo_cache)
111
117
end
112
118
end
113
119
struct DataDepsNonAliasingState
@@ -156,6 +162,12 @@ struct DataDepsState{State<:Union{DataDepsAliasingState,DataDepsNonAliasingState
156
162
end
157
163
end
158
164
165
+ function aliasing (astate:: DataDepsAliasingState , arg, dep_mod)
166
+ return get! (astate. ainfo_cache, (arg, dep_mod)) do
167
+ return aliasing (arg, dep_mod)
168
+ end
169
+ end
170
+
159
171
# Determine which arguments could be written to, and thus need tracking
160
172
161
173
" Whether `arg` has any writedep in this datadeps region."
@@ -190,7 +202,7 @@ function has_writedep(state::DataDepsState, arg, deps, task::DTask)
190
202
for (readdep, writedep, other_ainfo, _, _) in other_taskdeps
191
203
writedep || continue
192
204
for (dep_mod, _, _) in deps
193
- ainfo = aliasing (arg, dep_mod)
205
+ ainfo = aliasing (state . alias_state, arg, dep_mod)
194
206
if will_alias (ainfo, other_ainfo)
195
207
return true
196
208
end
@@ -239,7 +251,7 @@ function populate_task_info!(state::DataDepsState, spec::DTaskSpec, task::DTask)
239
251
# Add all aliasing dependencies
240
252
for (dep_mod, readdep, writedep) in deps
241
253
if state. aliasing
242
- ainfo = aliasing (arg, dep_mod)
254
+ ainfo = aliasing (state . alias_state, arg, dep_mod)
243
255
else
244
256
ainfo = UnknownAliasing ()
245
257
end
260
272
function populate_argument_info! (state:: DataDepsState{DataDepsAliasingState} , arg, deps)
261
273
astate = state. alias_state
262
274
for (dep_mod, readdep, writedep) in deps
263
- ainfo = aliasing (arg, dep_mod)
275
+ ainfo = aliasing (astate, arg, dep_mod)
264
276
265
277
# Initialize owner and readers
266
278
if ! haskey (astate. ainfos_owner, ainfo)
@@ -677,7 +689,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
677
689
end
678
690
if queue. aliasing
679
691
for (dep_mod, _, _) in deps
680
- ainfo = aliasing (arg, dep_mod)
692
+ ainfo = aliasing (astate, arg, dep_mod)
681
693
data_space = astate. data_locality[ainfo]
682
694
nonlocal = our_space != data_space
683
695
if nonlocal
@@ -740,7 +752,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
740
752
type_may_alias (typeof (arg)) || continue
741
753
if queue. aliasing
742
754
for (dep_mod, _, writedep) in deps
743
- ainfo = aliasing (arg, dep_mod)
755
+ ainfo = aliasing (astate, arg, dep_mod)
744
756
if writedep
745
757
@dagdebug nothing :spawn_datadeps " ($(repr (spec. f)) )[$idx ][$dep_mod ] Syncing as writer"
746
758
get_write_deps! (state, ainfo, task, write_num, syncdeps)
@@ -773,7 +785,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
773
785
type_may_alias (typeof (arg)) || continue
774
786
if queue. aliasing
775
787
for (dep_mod, _, writedep) in deps
776
- ainfo = aliasing (arg, dep_mod)
788
+ ainfo = aliasing (astate, arg, dep_mod)
777
789
if writedep
778
790
@dagdebug nothing :spawn_datadeps " ($(repr (spec. f)) )[$idx ][$dep_mod ] Set as owner"
779
791
add_writer! (state, ainfo, task, write_num)
0 commit comments