Skip to content

Commit ee6b0ce

Browse files
authored
Merge pull request #534 from JuliaParallel/jps/views-aliasing-opt
aliasing: Add optimized will_alias for views
2 parents b2fd2ab + b68ad4a commit ee6b0ce

File tree

2 files changed

+67
-10
lines changed

2 files changed

+67
-10
lines changed

Diff for: src/memory-spaces.jl

+14-10
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ aliasing(x::Transpose) = aliasing(parent(x))
136136
aliasing(x::Adjoint) = aliasing(parent(x))
137137

138138
struct StridedAliasing{T,N,S} <: AbstractAliasing
139+
base_ptr::RemotePtr{Cvoid,S}
139140
ptr::RemotePtr{Cvoid,S}
141+
base_inds::NTuple{N,UnitRange{Int}}
140142
lengths::NTuple{N,Int}
141143
strides::NTuple{N,Int}
142144
end
@@ -161,32 +163,34 @@ function _memory_spans(a::StridedAliasing{T,N,S}, spans, ptr, dim) where {T,N,S}
161163

162164
return spans
163165
end
164-
function aliasing(x::SubArray{T}) where T
166+
function aliasing(x::SubArray{T,N,A}) where {T,N,A<:Array}
165167
if isbitstype(T)
166168
S = CPURAMMemorySpace
167-
return StridedAliasing{T,ndims(x),S}(RemotePtr{Cvoid}(pointer(x)),
169+
return StridedAliasing{T,ndims(x),S}(RemotePtr{Cvoid}(pointer(parent(x))),
170+
RemotePtr{Cvoid}(pointer(x)),
171+
parentindices(x),
168172
size(x), strides(parent(x)))
169173
else
170174
# FIXME: Also ContiguousAliasing of container
171175
#return IteratedAliasing(x)
172176
return UnknownAliasing()
173177
end
174178
end
175-
#= TODO: Fix and enable strided aliasing optimization
176179
function will_alias(x::StridedAliasing{T,N,S}, y::StridedAliasing{T,N,S}) where {T,N,S}
177-
# TODO: Upgrade Contiguous/StridedAlising to same number of dims
180+
if x.base_ptr != y.base_ptr
181+
# FIXME: Conservatively incorrect via `unsafe_wrap` and friends
182+
return false
183+
end
184+
178185
for dim in 1:N
179-
# FIXME: Adjust ptrs to common base
180-
x_span = MemorySpan{S}(x.ptr, sizeof(T)*x.strides[dim])
181-
y_span = MemorySpan{S}(y.ptr, sizeof(T)*y.strides[dim])
182-
@show dim x_span y_span
183-
if !will_alias(x_span, y_span)
186+
if ((x.base_inds[dim].stop) < (y.base_inds[dim].start) || (y.base_inds[dim].stop) < (x.base_inds[dim].start))
184187
return false
185188
end
186189
end
190+
187191
return true
188192
end
189-
=#
193+
# FIXME: Upgrade Contiguous/StridedAlising to same number of dims
190194

191195
struct TriangularAliasing{T,S} <: AbstractAliasing
192196
ptr::RemotePtr{Cvoid,S}

Diff for: test/datadeps.jl

+53
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,59 @@ function test_datadeps(;args_chunks::Bool,
337337
test_task_dominators(logs, tid_lower2, [tid_B, tid_lower, tid_unitlower, tid_diag, tid_unitlower2]; all_tids=tids_all, nondom_check=false)
338338
test_task_dominators(logs, tid_unitupper2, [tid_B, tid_upper, tid_unitupper]; all_tids=tids_all, nondom_check=false)
339339
test_task_dominators(logs, tid_upper2, [tid_B, tid_upper, tid_unitupper, tid_diag, tid_unitupper2]; all_tids=tids_all, nondom_check=false)
340+
341+
# Additional aliasing tests
342+
views_overlap(x, y) = Dagger.will_alias(Dagger.aliasing(x), Dagger.aliasing(y))
343+
344+
A = wrap_chunk_thunk(identity, B)
345+
346+
A_r1 = wrap_chunk_thunk(view, A, 1:1, 1:4)
347+
A_r2 = wrap_chunk_thunk(view, A, 2:2, 1:4)
348+
B_r1 = wrap_chunk_thunk(view, B, 1:1, 1:4)
349+
B_r2 = wrap_chunk_thunk(view, B, 2:2, 1:4)
350+
351+
A_c1 = wrap_chunk_thunk(view, A, 1:4, 1:1)
352+
A_c2 = wrap_chunk_thunk(view, A, 1:4, 2:2)
353+
B_c1 = wrap_chunk_thunk(view, B, 1:4, 1:1)
354+
B_c2 = wrap_chunk_thunk(view, B, 1:4, 2:2)
355+
356+
A_mid = wrap_chunk_thunk(view, A, 2:3, 2:3)
357+
B_mid = wrap_chunk_thunk(view, B, 2:3, 2:3)
358+
359+
@test views_overlap(A_r1, A_r1)
360+
@test views_overlap(B_r1, B_r1)
361+
@test views_overlap(A_c1, A_c1)
362+
@test views_overlap(B_c1, B_c1)
363+
364+
@test views_overlap(A_r1, B_r1)
365+
@test views_overlap(A_r2, B_r2)
366+
@test views_overlap(A_c1, B_c1)
367+
@test views_overlap(A_c2, B_c2)
368+
369+
@test !views_overlap(A_r1, A_r2)
370+
@test !views_overlap(B_r1, B_r2)
371+
@test !views_overlap(A_c1, A_c2)
372+
@test !views_overlap(B_c1, B_c2)
373+
374+
@test views_overlap(A_r1, A_c1)
375+
@test views_overlap(A_r1, B_c1)
376+
@test views_overlap(A_r2, A_c2)
377+
@test views_overlap(A_r2, B_c2)
378+
379+
for (name, mid) in ((:A_mid, A_mid), (:B_mid, B_mid))
380+
@test !views_overlap(A_r1, mid)
381+
@test !views_overlap(B_r1, mid)
382+
@test !views_overlap(A_c1, mid)
383+
@test !views_overlap(B_c1, mid)
384+
385+
@test views_overlap(A_r2, mid)
386+
@test views_overlap(B_r2, mid)
387+
@test views_overlap(A_c2, mid)
388+
@test views_overlap(B_c2, mid)
389+
end
390+
391+
@test views_overlap(A_mid, A_mid)
392+
@test views_overlap(A_mid, B_mid)
340393
end
341394

342395
# FIXME: Deps

0 commit comments

Comments
 (0)