Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1.10 Forward mode segfault #948

Closed
wsmoses opened this issue Jul 13, 2023 · 6 comments
Closed

1.10 Forward mode segfault #948

wsmoses opened this issue Jul 13, 2023 · 6 comments

Comments

@wsmoses
Copy link
Member

wsmoses commented Jul 13, 2023

using ElectrochemicalKinetics
using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

mhcd = MarcusHushChidseyDOS(10000, 0.3, string(dirname(pathof(ElectrochemicalKinetics)), "/../data/DOSes/Cu_111_dos.txt"))

function qintegrand(
    mhcd::MarcusHushChidseyDOS,
    V_dl,
    ox::Val;
    T = 298,
    V_q = 0.0,
)
    E -> mhcd.dos.interp_func.(E .+ V_q)
end

function myintegrand(km::IntegralModel, V, a_r)
   E -> a_r .* qintegrand(km, V, Val(true))(E)
end

f2(mhcd, V) = myintegrand(mhcd, V, 1.0)(0.0)

autodiff(Forward, f2, Duplicated, Const(mhcd), Duplicated(0.2, 1.0))
@wsmoses
Copy link
Member Author

wsmoses commented Jul 13, 2023

Min segfault:

using ElectrochemicalKinetics
using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

mhcd = MarcusHushChidseyDOS(10000, 0.3, string(dirname(pathof(ElectrochemicalKinetics)), "/../data/DOSes/Cu_111_dos.txt"))

function qintegrand(
    mhcd::MarcusHushChidseyDOS,
    V_dl,
    ox::Val;
    T = 298,
    V_q = 0.0,
)
    E -> mhcd.dos.interp_func.(V_q)
end

function myintegrand(km, V, a_r)
   E -> a_r .* qintegrand(km, V, Val(true))(E)
end

f2(mhcd, V) = myintegrand(mhcd, V, 1.0)(0.0)

autodiff(Forward, f2, Duplicated, Const(mhcd), Duplicated(0.2, 1.0))

Guaranteed to error when primal is not:

using ElectrochemicalKinetics
using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

mhcd = MarcusHushChidseyDOS(10000, 0.3, string(dirname(pathof(ElectrochemicalKinetics)), "/../data/DOSes/Cu_111_dos.txt"))

function qintegrand(
    mhcd::MarcusHushChidseyDOS,
    V_dl,
    ox::Val;
    T = 298,
    V_q = 0.0,
)
    E -> mhcd.dos.interp_func.(V_q)
end

function myintegrand(km, V, a_r)
   E -> a_r .* mhcd.dos.interp_func.(V)
end

f2(mhcd, V) = myintegrand(mhcd, V, 1.0)(0.0)

f2(mhcd, 0.2)
autodiff(Forward, f2, Duplicated, Const(mhcd), Duplicated(0.2, 1.0))

@wsmoses
Copy link
Member Author

wsmoses commented Jul 13, 2023

using ElectrochemicalKinetics
using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

struct MyMarcusHushChidseyDOS <: IntegralModel{Float64}
    A::Float64
    dos::ElectrochemicalKinetics.DOSData
end


MyMarcusHushChidseyDOS(a, dos_file::Union{Matrix,String}; kwargs...) =
    MyMarcusHushChidseyDOS(a, DOSData(dos_file; kwargs...))

mhcd = MyMarcusHushChidseyDOS(0.3, string(dirname(pathof(ElectrochemicalKinetics)), "/../data/DOSes/Cu_111_dos.txt"));

function myintegrand(V, a_r)
   E -> mhcd.dos.interp_func.(V)
end

f2(V) = myintegrand(V, 1.0)(0.0)

f2(0.2)
autodiff(Forward, f2, Duplicated, Duplicated(0.2, 1.0))

@wsmoses
Copy link
Member Author

wsmoses commented Jul 14, 2023

Segfault minimization:

using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

using Interpolations

struct DOSData
    interp_func
end

(dd::DOSData)(E::Real) = dd.interp_func(E)

function get_dos()
    dd = [2.9516809522939885e-11, 8.676719161498216e-11, 2.487891370172147e-10, 6.958201977049105e-10, 1.898245560200562e-9, 5.05123413215916e-9, 1.3110895325949973e-8, 3.319379790963994e-8, 8.197308610758888e-8, 1.9745828933791896e-7, 4.6394788513206215e-7, 1.0632925551022797e-6, 2.3769830855968095e-6, 5.183094822926701e-6, 1.102406998435485e-5, 2.2870966284360038e-5, 4.6282500063521246e-5, 9.135637360226178e-5, 0.00017589384325990786, 0.0003303331584502414, 0.0006051227028130094, 0.0010812458918077518, 0.0018844960924227201, 0.0032037289202538123, 0.005312586752500653, 0.008593024836576044, 0.01355738307784779, 0.020863898123823135, 0.03131878118179209, 0.045856838750532015, 0.06549276308638619, 0.09123733508170402, 0.1239773009662438, 0.16432455312533853, 0.21244870984446, 0.26791572595103424, 0.32956165114951136, 0.3954327898879993, 0.46281947759703546, 0.5283997972828794, 0.5884928005834497, 0.6394009131743121, 0.677802270771196, 0.7011402225530853, 0.7079528175990029, 0.6980914868568764, 0.6727944873031677, 0.6346036099078469, 0.5871371193345678]
    dos_interp = interpolate(dd, BSpline(Linear()))
    return dos_interp
end

function qintegrand(
    mhcd,
    V_dl;
    V_q = 1.0,
)
    E -> mhcd.interp_func.(V_q)
end

function myintegrand(km, V, a_r)
   E -> qintegrand(km, V)(E)
end

f2(mhcd, V) = myintegrand(mhcd, V, 1.0)(0.0)

dos = DOSData(get_dos())

autodiff(Forward, f2, Duplicated, Const(dos), Duplicated(0.2, 1.0))

[2292120] signal (11.1): Segmentation fault
in expression starting at REPL[11]:1
getindex at ./essentials.jl:13 [inlined]
interp_getindex at /home/wmoses/.julia/packages/Interpolations/nDwIa/src/Interpolations.jl:296 [inlined]
interp_getindex at /home/wmoses/.julia/packages/Interpolations/nDwIa/src/Interpolations.jl:290 [inlined]
getindex at /home/wmoses/.julia/packages/Interpolations/nDwIa/src/Interpolations.jl:279 [inlined]
BSplineInterpolation at /home/wmoses/.julia/packages/Interpolations/nDwIa/src/b-splines/indexing.jl:8 [inlined]
_broadcast_getindex_evalf at ./broadcast.jl:709 [inlined]
_broadcast_getindex at ./broadcast.jl:682 [inlined]
getindex at ./broadcast.jl:636 [inlined]
copy at ./broadcast.jl:918 [inlined]
materialize at ./broadcast.jl:903 [inlined]
materialize at ./broadcast.jl:0 [inlined]
fwddiffejulia_materialize_2392_inner_1wrap at ./broadcast.jl:0
macro expansion at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9371 [inlined]
enzyme_call at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9049 [inlined]
ForwardModeThunk at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9015 [inlined]
runtime_generic_fwd at /home/wmoses/git/Enzyme.jl/src/compiler.jl:1207
unknown function (ip: 0x7f636450ed67)
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
#2 at ./REPL[7]:6
#4 at ./REPL[8]:2 [inlined]
f2 at ./REPL[9]:1 [inlined]
f2 at ./REPL[9]:0 [inlined]
fwddiffejulia_f2_828_inner_1wrap at ./REPL[9]:0
macro expansion at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9371 [inlined]
enzyme_call at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9049
unknown function (ip: 0x7f6477078ac6)
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
do_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:768
ForwardModeThunk at /home/wmoses/git/Enzyme.jl/src/compiler.jl:9015
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
do_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:768
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:330
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
do_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:768
autodiff at /home/wmoses/git/Enzyme.jl/src/Enzyme.jl:222
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
do_call at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/interpreter.c:125
eval_value at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/interpreter.c:222
eval_stmt_value at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/interpreter.c:173 [inlined]
eval_body at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/interpreter.c:616
jl_interpret_toplevel_thunk at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/interpreter.c:774
jl_toplevel_eval_flex at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/toplevel.c:993
eval at ./boot.jl:383 [inlined]
eval_user_input at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
repl_backend_loop at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
#start_repl_backend#46 at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
start_repl_backend at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:228
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
#run_repl#59 at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:376
run_repl at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:362
jfptr_run_repl_91741.1 at /home/wmoses/git/Enzyme.jl/julia-1.10.0-alpha1/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
#1010 at ./client.jl:432
jfptr_YY.1010_82531.1 at /home/wmoses/git/Enzyme.jl/julia-1.10.0-alpha1/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
jl_f__call_latest at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:867 [inlined]
invokelatest at ./essentials.jl:864 [inlined]
run_main_repl at ./client.jl:416
exec_options at ./client.jl:333
_start at ./client.jl:552
jfptr__start_82560.1 at /home/wmoses/git/Enzyme.jl/julia-1.10.0-alpha1/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2890 [inlined]
ijl_apply_generic at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3072
jl_apply at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1965 [inlined]
true_main at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/default-amdci5-1/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x7f648fe42d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x401098)
Allocations: 16318174 (Pool: 16293720; Big: 24454); GC: 24
Segmentation fault (core dumped)

@wsmoses
Copy link
Member Author

wsmoses commented Jul 14, 2023

using Enzyme
Enzyme.API.runtimeActivity!(true) # comment this out or not...

using Interpolations

struct DOSData
    interp_func
end

@inline function (itp)(x::Vararg{Number,N}) where {T,N}
    wis = Interpolations.weightedindexes((Interpolations.value_weights,), (BSpline(Linear()),), (Base.OneTo(3),), x)
    Interpolations.InterpGetindex(Interpolations.coefficients(itp))[wis...]
end

function get_dos()
    dd = [2.9516809522939885e-11, 3.0, 6.0]
    dos_interp = interpolate(dd, BSpline(Linear()))
    return dos_interp
end

function qintegrand(
    mhcd,
    V_dl;
    V_q = 1.0,
)
    E -> mhcd.interp_func.(V_q)
end

function myintegrand(km, V, a_r)
   E -> qintegrand(km, V)(E)
end

f2(mhcd, V) = myintegrand(mhcd, V, 1.0)(0.0)

dos = DOSData(get_dos())

f2(dos, 0.2)
autodiff(Forward, f2, Duplicated, Const(dos), Duplicated(0.2, 1.0))

@wsmoses
Copy link
Member Author

wsmoses commented Jul 17, 2023

using Enzyme, Interpolations
Enzyme.API.runtimeActivity!(true) 
Enzyme.API.printall!(true)
fn = Base.Broadcast.broadcasted;
dd = [2.9516809522939885e-11, 3.0, 6.0]
dos_interp = interpolate(dd, BSpline(Linear()))
Enzyme.autodiff(Forward, Base.Broadcast.broadcasted, Const(dos_interp), Duplicated(1.0, 0.0))

@wsmoses
Copy link
Member Author

wsmoses commented Jul 17, 2023


julia> Enzyme.autodiff(Forward, Base.Broadcast.broadcasted, Const(dos_interp), Duplicated(1.0, 0.0))
after simplification :
; Function Attrs: mustprogress nofree nosync readnone willreturn
define { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } @preprocess_julia_broadcasted_699_inner.1({ {} addrspace(10)*, [1 x [1 x i64]] } %0, double %1) local_unnamed_addr #4 !dbg !54 {
entry:
  %2 = call {}*** @julia.get_pgcstack() #5, !noalias !59
  call void @llvm.dbg.declare(metadata { {} addrspace(10)*, [1 x [1 x i64]] } addrspace(11)* undef, metadata !57, metadata !DIExpression(DW_OP_deref)) #5, !dbg !63
  call void @llvm.dbg.value(metadata double %1, metadata !58, metadata !DIExpression()) #5, !dbg !65
  %3 = insertvalue { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } zeroinitializer, { {} addrspace(10)*, [1 x [1 x i64]] } %0, 0, !dbg !66
  %.fca.0.insert9 = insertvalue [1 x double] poison, double %1, 0, !dbg !66
  %4 = insertvalue { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } %3, [1 x double] %.fca.0.insert9, 1, !dbg !66
  ret { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } %4, !dbg !71
}

; Function Attrs: mustprogress nofree nosync readnone willreturn
define internal { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } @fwddiffejulia_broadcasted_699_inner.1({ {} addrspace(10)*, [1 x [1 x i64]] } %0, double %1, double %"'") local_unnamed_addr #4 !dbg !72 {
entry:
  %2 = call {}*** @julia.get_pgcstack() #5, !noalias !77
  %3 = insertvalue { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } zeroinitializer, { {} addrspace(10)*, [1 x [1 x i64]] } %0, 0, !dbg !81
  %".fca.0.insert9'ipiv" = insertvalue [1 x double] zeroinitializer, double %"'", 0, !dbg !81
  %"'ipiv" = insertvalue { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } zeroinitializer, [1 x double] %".fca.0.insert9'ipiv", 1, !dbg !81
  ret { { {} addrspace(10)*, [1 x [1 x i64]] }, [1 x double] } %"'ipiv"
}

┌ Error: Error in the keymap
│   exception =
│    UndefRefError: access to undefined reference
│    Stacktrace:
│      [1] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:293
│      [2] (::REPL.var"#57#58"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:287
│      [3] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:557
│      [4] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:285
│      [5] (::REPL.var"#do_respond#80"{Bool, Bool, REPL.var"#93#103"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:899
│      [6] (::REPL.var"#98#108"{Regex, Regex, Int64, Int64, REPL.LineEdit.Prompt, REPL.LineEdit.Prompt, REPL.LineEdit.Prompt})(::REPL.LineEdit.MIState, ::Any, ::Vararg{Any})
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:1236
│      [7] #invokelatest#2
│        @ ./essentials.jl:816 [inlined]
│      [8] invokelatest
│        @ ./essentials.jl:813 [inlined]
│      [9] (::REPL.LineEdit.var"#27#28"{REPL.var"#98#108"{Regex, Regex, Int64, Int64, REPL.LineEdit.Prompt, REPL.LineEdit.Prompt, REPL.LineEdit.Prompt}, String})(s::Any, p::Any)
│        @ REPL.LineEdit ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/LineEdit.jl:1603
│     [10] prompt!(term::REPL.Terminals.TextTerminal, prompt::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
│        @ REPL.LineEdit ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/LineEdit.jl:2740
│     [11] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
│        @ REPL.LineEdit ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/LineEdit.jl:2642
│     [12] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
│        @ REPL ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/REPL.jl:1300
│     [13] (::REPL.var"#62#68"{REPL.LineEditREPL, REPL.REPLBackendRef})()
│        @ REPL ./task.jl:514
└ @ REPL.LineEdit ~/git/Enzyme.jl/julia9/usr/share/julia/stdlib/v1.9/REPL/src/LineEdit.jl:2742

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant