@@ -98,6 +98,9 @@ struct DataDepsAliasingState
9898 ainfos_readers:: Dict{AbstractAliasing,Vector{Pair{DTask,Int}}}
9999 ainfos_overlaps:: Dict{AbstractAliasing,Set{AbstractAliasing}}
100100
101+ # Cache ainfo lookups
102+ ainfo_cache:: Dict{Tuple{Any,Any},AbstractAliasing}
103+
101104 function DataDepsAliasingState ()
102105 data_origin = Dict {AbstractAliasing,MemorySpace} ()
103106 data_locality = Dict {AbstractAliasing,MemorySpace} ()
@@ -106,8 +109,11 @@ struct DataDepsAliasingState
106109 ainfos_readers = Dict {AbstractAliasing,Vector{Pair{DTask,Int}}} ()
107110 ainfos_overlaps = Dict {AbstractAliasing,Set{AbstractAliasing}} ()
108111
112+ ainfo_cache = Dict {Tuple{Any,Any},AbstractAliasing} ()
113+
109114 return new (data_origin, data_locality,
110- ainfos_owner, ainfos_readers, ainfos_overlaps)
115+ ainfos_owner, ainfos_readers, ainfos_overlaps,
116+ ainfo_cache)
111117 end
112118end
113119struct DataDepsNonAliasingState
@@ -156,6 +162,12 @@ struct DataDepsState{State<:Union{DataDepsAliasingState,DataDepsNonAliasingState
156162 end
157163end
158164
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+
159171# Determine which arguments could be written to, and thus need tracking
160172
161173" Whether `arg` has any writedep in this datadeps region."
@@ -190,7 +202,7 @@ function has_writedep(state::DataDepsState, arg, deps, task::DTask)
190202 for (readdep, writedep, other_ainfo, _, _) in other_taskdeps
191203 writedep || continue
192204 for (dep_mod, _, _) in deps
193- ainfo = aliasing (arg, dep_mod)
205+ ainfo = aliasing (state . alias_state, arg, dep_mod)
194206 if will_alias (ainfo, other_ainfo)
195207 return true
196208 end
@@ -239,7 +251,7 @@ function populate_task_info!(state::DataDepsState, spec::DTaskSpec, task::DTask)
239251 # Add all aliasing dependencies
240252 for (dep_mod, readdep, writedep) in deps
241253 if state. aliasing
242- ainfo = aliasing (arg, dep_mod)
254+ ainfo = aliasing (state . alias_state, arg, dep_mod)
243255 else
244256 ainfo = UnknownAliasing ()
245257 end
260272function populate_argument_info! (state:: DataDepsState{DataDepsAliasingState} , arg, deps)
261273 astate = state. alias_state
262274 for (dep_mod, readdep, writedep) in deps
263- ainfo = aliasing (arg, dep_mod)
275+ ainfo = aliasing (astate, arg, dep_mod)
264276
265277 # Initialize owner and readers
266278 if ! haskey (astate. ainfos_owner, ainfo)
@@ -677,7 +689,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
677689 end
678690 if queue. aliasing
679691 for (dep_mod, _, _) in deps
680- ainfo = aliasing (arg, dep_mod)
692+ ainfo = aliasing (astate, arg, dep_mod)
681693 data_space = astate. data_locality[ainfo]
682694 nonlocal = our_space != data_space
683695 if nonlocal
@@ -740,7 +752,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
740752 type_may_alias (typeof (arg)) || continue
741753 if queue. aliasing
742754 for (dep_mod, _, writedep) in deps
743- ainfo = aliasing (arg, dep_mod)
755+ ainfo = aliasing (astate, arg, dep_mod)
744756 if writedep
745757 @dagdebug nothing :spawn_datadeps " ($(repr (spec. f)) )[$idx ][$dep_mod ] Syncing as writer"
746758 get_write_deps! (state, ainfo, task, write_num, syncdeps)
@@ -773,7 +785,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
773785 type_may_alias (typeof (arg)) || continue
774786 if queue. aliasing
775787 for (dep_mod, _, writedep) in deps
776- ainfo = aliasing (arg, dep_mod)
788+ ainfo = aliasing (astate, arg, dep_mod)
777789 if writedep
778790 @dagdebug nothing :spawn_datadeps " ($(repr (spec. f)) )[$idx ][$dep_mod ] Set as owner"
779791 add_writer! (state, ainfo, task, write_num)
0 commit comments