90
90
struct DataDepsAliasingState
91
91
# Track original and current data locations
92
92
# We track data => space
93
- data_origin:: Dict{AbstractAliasing ,MemorySpace}
94
- data_locality:: Dict{AbstractAliasing ,MemorySpace}
93
+ data_origin:: Dict{AliasingWrapper ,MemorySpace}
94
+ data_locality:: Dict{AliasingWrapper ,MemorySpace}
95
95
96
96
# Track writers ("owners") and readers
97
- ainfos_owner:: Dict{AbstractAliasing ,Union{Pair{DTask,Int},Nothing}}
98
- ainfos_readers:: Dict{AbstractAliasing ,Vector{Pair{DTask,Int}}}
99
- ainfos_overlaps:: Dict{AbstractAliasing ,Set{AbstractAliasing }}
97
+ ainfos_owner:: Dict{AliasingWrapper ,Union{Pair{DTask,Int},Nothing}}
98
+ ainfos_readers:: Dict{AliasingWrapper ,Vector{Pair{DTask,Int}}}
99
+ ainfos_overlaps:: Dict{AliasingWrapper ,Set{AliasingWrapper }}
100
100
101
101
# Cache ainfo lookups
102
- ainfo_cache:: Dict{Tuple{Any,Any},AbstractAliasing }
102
+ ainfo_cache:: Dict{Tuple{Any,Any},AliasingWrapper }
103
103
104
104
function DataDepsAliasingState ()
105
- data_origin = Dict {AbstractAliasing ,MemorySpace} ()
106
- data_locality = Dict {AbstractAliasing ,MemorySpace} ()
105
+ data_origin = Dict {AliasingWrapper ,MemorySpace} ()
106
+ data_locality = Dict {AliasingWrapper ,MemorySpace} ()
107
107
108
- ainfos_owner = Dict {AbstractAliasing ,Union{Pair{DTask,Int},Nothing}} ()
109
- ainfos_readers = Dict {AbstractAliasing ,Vector{Pair{DTask,Int}}} ()
110
- ainfos_overlaps = Dict {AbstractAliasing ,Set{AbstractAliasing }} ()
108
+ ainfos_owner = Dict {AliasingWrapper ,Union{Pair{DTask,Int},Nothing}} ()
109
+ ainfos_readers = Dict {AliasingWrapper ,Vector{Pair{DTask,Int}}} ()
110
+ ainfos_overlaps = Dict {AliasingWrapper ,Set{AliasingWrapper }} ()
111
111
112
- ainfo_cache = Dict {Tuple{Any,Any},AbstractAliasing } ()
112
+ ainfo_cache = Dict {Tuple{Any,Any},AliasingWrapper } ()
113
113
114
114
return new (data_origin, data_locality,
115
115
ainfos_owner, ainfos_readers, ainfos_overlaps,
@@ -142,7 +142,7 @@ struct DataDepsState{State<:Union{DataDepsAliasingState,DataDepsNonAliasingState
142
142
aliasing:: Bool
143
143
144
144
# The ordered list of tasks and their read/write dependencies
145
- dependencies:: Vector {Pair{DTask,Vector{Tuple{Bool,Bool,<: AbstractAliasing ,<: Any ,<: Any }}}}
145
+ dependencies:: Vector {Pair{DTask,Vector{Tuple{Bool,Bool,AliasingWrapper ,<: Any ,<: Any }}}}
146
146
147
147
# The mapping of memory space to remote argument copies
148
148
remote_args:: Dict{MemorySpace,IdDict{Any,Any}}
@@ -154,7 +154,7 @@ struct DataDepsState{State<:Union{DataDepsAliasingState,DataDepsNonAliasingState
154
154
alias_state:: State
155
155
156
156
function DataDepsState (aliasing:: Bool )
157
- dependencies = Pair{DTask,Vector{Tuple{Bool,Bool,<: AbstractAliasing ,<: Any ,<: Any }}}[]
157
+ dependencies = Pair{DTask,Vector{Tuple{Bool,Bool,AliasingWrapper ,<: Any ,<: Any }}}[]
158
158
remote_args = Dict {MemorySpace,IdDict{Any,Any}} ()
159
159
supports_inplace_cache = IdDict {Any,Bool} ()
160
160
if aliasing
168
168
169
169
function aliasing (astate:: DataDepsAliasingState , arg, dep_mod)
170
170
return get! (astate. ainfo_cache, (arg, dep_mod)) do
171
- return aliasing (arg, dep_mod)
171
+ return AliasingWrapper ( aliasing (arg, dep_mod) )
172
172
end
173
173
end
174
174
245
245
# Aliasing state setup
246
246
function populate_task_info! (state:: DataDepsState , spec:: DTaskSpec , task:: DTask )
247
247
# Populate task dependencies
248
- dependencies_to_add = Vector {Tuple{Bool,Bool,AbstractAliasing ,<:Any,<:Any}} ()
248
+ dependencies_to_add = Vector {Tuple{Bool,Bool,AliasingWrapper ,<:Any,<:Any}} ()
249
249
250
250
# Track the task's arguments and access patterns
251
251
for (idx, _arg) in enumerate (spec. fargs)
@@ -263,7 +263,7 @@ function populate_task_info!(state::DataDepsState, spec::DTaskSpec, task::DTask)
263
263
if state. aliasing
264
264
ainfo = aliasing (state. alias_state, arg, dep_mod)
265
265
else
266
- ainfo = UnknownAliasing ()
266
+ ainfo = AliasingWrapper ( UnknownAliasing () )
267
267
end
268
268
push! (dependencies_to_add, (readdep, writedep, ainfo, dep_mod, arg))
269
269
end
@@ -274,7 +274,7 @@ function populate_task_info!(state::DataDepsState, spec::DTaskSpec, task::DTask)
274
274
275
275
# Track the task result too
276
276
# N.B. We state no readdep/writedep because, while we can't model the aliasing info for the task result yet, we don't want to synchronize because of this
277
- push! (dependencies_to_add, (false , false , UnknownAliasing (), identity, task))
277
+ push! (dependencies_to_add, (false , false , AliasingWrapper ( UnknownAliasing () ), identity, task))
278
278
279
279
# Record argument/result dependencies
280
280
push! (state. dependencies, task => dependencies_to_add)
@@ -286,7 +286,7 @@ function populate_argument_info!(state::DataDepsState{DataDepsAliasingState}, ar
286
286
287
287
# Initialize owner and readers
288
288
if ! haskey (astate. ainfos_owner, ainfo)
289
- overlaps = Set {AbstractAliasing } ()
289
+ overlaps = Set {AliasingWrapper } ()
290
290
push! (overlaps, ainfo)
291
291
for other_ainfo in keys (astate. ainfos_owner)
292
292
ainfo == other_ainfo && continue
368
368
369
369
function _get_write_deps! (state:: DataDepsState{DataDepsAliasingState} , ainfo:: AbstractAliasing , task, write_num, syncdeps)
370
370
astate = state. alias_state
371
- ainfo isa NoAliasing && return
371
+ ainfo. inner isa NoAliasing && return
372
372
for other_ainfo in astate. ainfos_overlaps[ainfo]
373
373
other_task_write_num = astate. ainfos_owner[other_ainfo]
374
374
@dagdebug nothing :spawn_datadeps " Considering sync with writer via $ainfo -> $other_ainfo "
@@ -381,7 +381,7 @@ function _get_write_deps!(state::DataDepsState{DataDepsAliasingState}, ainfo::Ab
381
381
end
382
382
function _get_read_deps! (state:: DataDepsState{DataDepsAliasingState} , ainfo:: AbstractAliasing , task, write_num, syncdeps)
383
383
astate = state. alias_state
384
- ainfo isa NoAliasing && return
384
+ ainfo. inner isa NoAliasing && return
385
385
for other_ainfo in astate. ainfos_overlaps[ainfo]
386
386
@dagdebug nothing :spawn_datadeps " Considering sync with reader via $ainfo -> $other_ainfo "
387
387
other_tasks = astate. ainfos_readers[other_ainfo]
@@ -864,7 +864,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
864
864
# in the correct order
865
865
866
866
# First, find the latest owners of each live ainfo
867
- arg_writes = IdDict {Any,Vector{Tuple{AbstractAliasing ,<:Any,MemorySpace}}} ()
867
+ arg_writes = IdDict {Any,Vector{Tuple{AliasingWrapper ,<:Any,MemorySpace}}} ()
868
868
for (task, taskdeps) in state. dependencies
869
869
for (_, writedep, ainfo, dep_mod, arg) in taskdeps
870
870
writedep || continue
@@ -873,7 +873,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
873
873
874
874
# Skip virtual writes from task result aliasing
875
875
# FIXME : Make this less bad
876
- if arg isa DTask && dep_mod === identity && ainfo isa UnknownAliasing
876
+ if arg isa DTask && dep_mod === identity && ainfo. inner isa UnknownAliasing
877
877
continue
878
878
end
879
879
@@ -884,7 +884,7 @@ function distribute_tasks!(queue::DataDepsTaskQueue)
884
884
end
885
885
886
886
# Get the set of writers
887
- ainfo_writes = get! (Vector{Tuple{AbstractAliasing ,<: Any ,MemorySpace}}, arg_writes, arg)
887
+ ainfo_writes = get! (Vector{Tuple{AliasingWrapper ,<: Any ,MemorySpace}}, arg_writes, arg)
888
888
889
889
#= FIXME : If we fully overlap any writer, evict them
890
890
idxs = findall(ainfo_write->overlaps_all(ainfo, ainfo_write[1]), ainfo_writes)
0 commit comments