Julia segfaults when using maps over a segmented array
On Enzyme#main, I was able to get a greatly reduced example of the error from today. Here is the offending code snippet. One thing to note is that this seems only to segfault randomly, so I am not sure if I fully nailed it.
using Enzyme
function transform_inner(y::AbstractVector, index)
T = eltype(y)
ℓi = zero(T)
x1 = y[index]
x2 = y[index+1]
return atan(x1, x2), ℓi, index+2
end
function transform_outer(x, index::T) where {T}
dims = (length(x)÷2,)
d = 2
len = prod(dims)
idx = reshape(range(index; length = len, step = d), dims)
yℓ = map(index -> ((y, ℓ, _) = transform_inner(x, index); (y, ℓ)), idx)
ℓz = zero(eltype(x))
index′ = index + d * len
first.(yℓ), isempty(yℓ) ? ℓz : ℓz + sum(last, yℓ), index′
end
function s(x)
y , lj, _ = transform_outer(x, 1)
return sum(y) + lj
end
x = randn(1000000)
dx = zero(x)
autodiff(Reverse, s, Duplicated(x, dx))
When it does fail I get the output
[249015] signal (11.1): Segmentation fault
in expression starting at /home/ptiede/.julia/dev/VLBIImagePriors/enzyme_error.jl:30
== at ./promotion.jl:521 [inlined]
iterate at ./range.jl:901 [inlined]
iterate at ./generator.jl:44 [inlined]
collect_to! at ./array.jl:892 [inlined]
collect_to_with_first! at ./array.jl:870 [inlined]
_collect at ./array.jl:864
collect_similar at ./array.jl:763 [inlined]
map at ./abstractarray.jl:3285 [inlined]
transform_outer at /home/ptiede/.julia/dev/VLBIImagePriors/enzyme_error.jl:16
s at /home/ptiede/.julia/dev/VLBIImagePriors/enzyme_error.jl:23 [inlined]
diffejulia_s_1402wrap at /home/ptiede/.julia/dev/VLBIImagePriors/enzyme_error.jl:0
macro expansion at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/compiler.jl:5377 [inlined]
enzyme_call at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/compiler.jl:5055 [inlined]
CombinedAdjointThunk at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/compiler.jl:4997 [inlined]
autodiff at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/Enzyme.jl:215 [inlined]
autodiff at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/Enzyme.jl:238 [inlined]
autodiff at /home/ptiede/.julia/packages/Enzyme/4RhrV/src/Enzyme.jl:224
unknown function (ip: 0x77345e5a54f6)
_jl_invoke at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_call at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/interpreter.c:126
eval_value at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/interpreter.c:223
eval_stmt_value at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/interpreter.c:174 [inlined]
eval_body at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
include_string at ./loading.jl:2076
_jl_invoke at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:3076
_include at ./loading.jl:2136
include at ./Base.jl:495
jfptr_include_46380.1 at /home/ptiede/.julia/juliaup/julia-1.10.1+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:3076
exec_options at ./client.jl:318
_start at ./client.jl:552
jfptr__start_82662.1 at /home/ptiede/.julia/juliaup/julia-1.10.1+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/default-maughin-0/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x7734c8229d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 25964758 (Pool: 25929086; Big: 35672); GC: 36
[1] 249015 segmentation fault (core dumped) julia enzyme_error.jl
I'll try to analyze the code with rr as well
Okay, this non-determinstically fails, but can reproduce:
wmoses@beast:~/git/Enzyme.jl ((HEAD detached at origin/main)) $ ./julia-1.10.0-rc2/bin/julia --project enzyme_error.jl
wmoses@beast:~/git/Enzyme.jl ((HEAD detached at origin/main)) $ ./julia-1.10.0-rc2/bin/julia --project enzyme_error.jl
[1978293] signal (11.1): Segmentation fault
in expression starting at /home/wmoses/git/Enzyme.jl/enzyme_error.jl:30
== at ./promotion.jl:521 [inlined]
iterate at ./range.jl:901 [inlined]
iterate at ./generator.jl:44 [inlined]
collect_to! at ./array.jl:892 [inlined]
collect_to_with_first! at ./array.jl:870 [inlined]
_collect at ./array.jl:864
collect_similar at ./array.jl:763 [inlined]
map at ./abstractarray.jl:3282 [inlined]
transform_outer at /home/wmoses/git/Enzyme.jl/enzyme_error.jl:16
s at /home/wmoses/git/Enzyme.jl/enzyme_error.jl:23 [inlined]
diffejulia_s_1445wrap at /home/wmoses/git/Enzyme.jl/enzyme_error.jl:0
macro expansion at /home/wmoses/git/Enzyme.jl/src/compiler.jl:5440 [inlined]
enzyme_call at /home/wmoses/git/Enzyme.jl/src/compiler.jl:5118
unknown function (ip: 0x7fb5fcdab6ec)
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/builtins.c:768
CombinedAdjointThunk at /home/wmoses/git/Enzyme.jl/src/compiler.jl:5000
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/builtins.c:768
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:275 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:300 [inlined]
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:284
unknown function (ip: 0x7fb71f902ce6)
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_call at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/interpreter.c:126
eval_value at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/interpreter.c:223
eval_stmt_value at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/interpreter.c:174 [inlined]
eval_body at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
include_string at ./loading.jl:2070
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
_include at ./loading.jl:2130
include at ./Base.jl:495
jfptr_include_46402.1 at /home/wmoses/git/Enzyme.jl/julia-1.10.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
exec_options at ./client.jl:318
_start at ./client.jl:552
jfptr__start_82776.1 at /home/wmoses/git/Enzyme.jl/julia-1.10.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/builder-amdci5-4/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x7fb720c29d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 26120592 (Pool: 26084141; Big: 36451); GC: 32
Segmentation fault (core dumped)
@ptiede running this locally, I think https://github.com/EnzymeAD/Enzyme.jl/pull/1421 may have fixed this (though that was not the point of that PR). In other words I can no longer reproduce this after that PR.
Does it work for you?
Magic! The new version seems to have fixed this. I'll close it. Thanks for fixing this.