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

Add reverse rule for Sparse dense matmul/vec #1792

Open
wants to merge 17 commits into
base: main
Choose a base branch
from

Conversation

ptiede
Copy link

@ptiede ptiede commented Sep 5, 2024

This is an attempt to fix #1682 by adding a specific rule to handle this case.

The approach I took was to create a specific rule for mul!(C,A,B,a,b). I did this rather than target spdensemul! because I wasn't sure if spdensemul! was considered public. I can change that if people feel different. A couple of other notes

  • I didn't handle the case where the sparse matrix is Duplicated since I would need something akin to ChainRulesCore ProjectTo for sparse matrices. If people really want this in this PR I can add it
  • I wasn't sure if BatchDuplicated should be supported here? a and b are numbers and so they'll be active. When I tried to support BatchDuplicated, my Julia session crashed, so maybe that isn't legal. If it is supposed to be supported, I can post the error message I found. Batch mode now works

On the brightside, in the examples from #1682 I now get

function test_sparse(M, v)
    return sum(abs2, M*v)
end


M = sprand(256, 128, 0.1)
v = rand(128)
dv = zero(v)

autodiff(Reverse, test_sparse, Active, Const(M), Duplicated(v, dv))

# This PR
BenchmarkTools.Trial: 10000 samples with 8 evaluations.
 Range (min  max):  3.832 μs   18.316 ms  ┊ GC (min  max):  0.00%  99.31%
 Time  (median):     4.987 μs               ┊ GC (median):     0.00%
 Time  (mean ± σ):   6.802 μs ± 183.623 μs  ┊ GC (mean ± σ):  28.55% ±  1.34%

                                        ▂▅█▇▄▁                 
  ▁▁▂▃▅▅▅▆▅▅▅▃▃▃▂▃▃▃▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▃▅▆███████▆▆▆▇█▇▅▄▃▂▂▁▁▁▁ ▃
  3.83 μs         Histogram: frequency by time        5.53 μs <

 Memory estimate: 4.58 KiB, allocs estimate: 11.

# Enzyme main
BenchmarkTools.Trial: 10000 samples with 1 evaluation.
 Range (min  max):  46.129 μs   1.031 ms  ┊ GC (min  max): 0.00%  0.00%
 Time  (median):     60.770 μs              ┊ GC (median):    0.00%
 Time  (mean ± σ):   61.452 μs ± 10.121 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%

                              ▃▇█▆▅▄▂                          
  ▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁▂▂▃▆████████▆▅▄▄▃▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ ▃
  46.1 μs         Histogram: frequency by time        73.1 μs <

 Memory estimate: 4.30 KiB, allocs estimate: 3.

@ptiede
Copy link
Author

ptiede commented Sep 6, 2024

To be explicit about the error I get when trying BatchDuplicated I get with this PR

C = zeros(18)
M = sprand(18, 9, 0.1)
v = randn(9)
α = 2.0 
β = 1.0

dC = ntuple(_->zero(C), 2)
dv = ntuple(_->zero(v), 2)

test_rrule(mul!, BatchDuplicated, (C, BatchDuplicated), (M, Const), (v, BatchDuplicated), (α, Active), (β, Active))
julia: /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:388: llvm::Type* llvm::Type::getNonOpaquePointerElementType() const: Assertion `getTypeID() == PointerTyID' failed.

[11240] signal (6.-6): Aborted
in expression starting at REPL[11]:1
pthread_kill at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
raise at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7cd1a042871a)
__assert_fail at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
getNonOpaquePointerElementType at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:388 [inlined]
getPointerElementType at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:381 [inlined]
addToInvertedPtrDiffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:838
addToInvertedPtrDiffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:1249
EnzymeGradientUtilsAddToInvertedPointerDiffeTT at /workspace/srcdir/Enzyme/enzyme/Enzyme/CApi.cpp:496
EnzymeGradientUtilsAddToInvertedPointerDiffeTT at /home/ptiede/.julia/dev/Enzyme/src/api.jl:262
unknown function (ip: 0x7cd1863d2fbc)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme_custom_common_rev at /home/ptiede/.julia/dev/Enzyme/src/rules/customrules.jl:1074 [inlined]
enzyme_custom_rev at /home/ptiede/.julia/dev/Enzyme/src/rules/customrules.jl:1130
unknown function (ip: 0x7cd1863cd695)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme_custom_rev_cfunc at /home/ptiede/.julia/dev/Enzyme/src/rules/llvmrules.jl:27
jfptr_enzyme_custom_rev_cfunc_6731 at /home/ptiede/.julia/compiled/v1.10/Enzyme/G1p5n_Iyla2.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jlcapi_enzyme_custom_rev_cfunc_9200 at /home/ptiede/.julia/compiled/v1.10/Enzyme/G1p5n_Iyla2.so (unknown line)
operator() at /opt/x86_64-linux-gnu/x86_64-linux-gnu/include/c++/10.2.0/bits/std_function.h:622 [inlined]
visitCallInst at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:6276
visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/InstVisitor.h:111 [inlined]
CreatePrimalAndGradient at /workspace/srcdir/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp:4396
EnzymeCreatePrimalAndGradient at /workspace/srcdir/Enzyme/enzyme/Enzyme/CApi.cpp:626
EnzymeCreatePrimalAndGradient at /home/ptiede/.julia/dev/Enzyme/src/api.jl:163
unknown function (ip: 0x7cd1863bf95b)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme! at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:4157
unknown function (ip: 0x7cd186f600f8)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#codegen#18999 at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:6438
codegen at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:5614 [inlined]
_thunk at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7241
_thunk at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7241 [inlined]
cached_compilation at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7282 [inlined]
thunkbase at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7355
unknown function (ip: 0x7cd186efa8c0)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#s2080#19052 at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7407 [inlined]
#s2080#19052 at ./none:0
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
GeneratedFunctionStub at ./boot.jl:602
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_call_staged at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/method.c:540
ijl_code_for_staged at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/method.c:593
get_staged at ./compiler/utilities.jl:123
retrieve_code_info at ./compiler/utilities.jl:135 [inlined]
InferenceState at ./compiler/inferencestate.jl:430
typeinf_edge at ./compiler/typeinfer.jl:920
abstract_call_method at ./compiler/abstractinterpretation.jl:629
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:95
abstract_call_known at ./compiler/abstractinterpretation.jl:2087
abstract_call at ./compiler/abstractinterpretation.jl:2169
abstract_call at ./compiler/abstractinterpretation.jl:2162
abstract_call at ./compiler/abstractinterpretation.jl:2354
abstract_eval_call at ./compiler/abstractinterpretation.jl:2370
abstract_eval_statement_expr at ./compiler/abstractinterpretation.jl:2380
abstract_eval_statement at ./compiler/abstractinterpretation.jl:2624
abstract_eval_basic_statement at ./compiler/abstractinterpretation.jl:2913
typeinf_local at ./compiler/abstractinterpretation.jl:3098
typeinf_nocycle at ./compiler/abstractinterpretation.jl:3186
_typeinf at ./compiler/typeinfer.jl:247
typeinf at ./compiler/typeinfer.jl:216
typeinf_ext at ./compiler/typeinfer.jl:1051
typeinf_ext_toplevel at ./compiler/typeinfer.jl:1082
typeinf_ext_toplevel at ./compiler/typeinfer.jl:1078
jfptr_typeinf_ext_toplevel_35703.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_type_infer at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:394
jl_generate_fptr_impl at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jitlayers.cpp:504
jl_compile_method_internal at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2481 [inlined]
jl_compile_method_internal at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2368
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2887 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/builtins.c:768
macro expansion at /home/ptiede/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:111 [inlined]
macro expansion at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
#test_reverse#54 at /home/ptiede/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:91
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/builtins.c:768
test_reverse at /home/ptiede/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:74
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_call at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:126
eval_value at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:223
eval_stmt_value at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:174 [inlined]
eval_body at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
eval_user_input at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
repl_backend_loop at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
#start_repl_backend#46 at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
start_repl_backend at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:228
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#run_repl#59 at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
run_repl at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
jfptr_run_repl_91805.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#1013 at ./client.jl:432
jfptr_YY.1013_82772.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
run_main_repl at ./client.jl:416
exec_options at ./client.jl:333
_start at ./client.jl:552
jfptr__start_82798.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x7cd1a0429d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 69317087 (Pool: 69189011; Big: 128076); GC: 66
[1]    11240 IOT instruction (core dumped)  julia

I get an identical error with the same setup if I do

C = zeros(18)
M = sprand(18, 9, 0.1)
v = randn(9)
α = 2.0 
β = 1.0

dC = ntuple(_->zero(C), 2)
dv = ntuple(_->zero(v), 2)

autodiff(Reverse, mul!, Const, BatchDuplicated(C, dC), Const(M), BatchDuplicated(v, dv), Active(α), Active(β))
julia: /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:388: llvm::Type* llvm::Type::getNonOpaquePointerElementType() const: Assertion `getTypeID() == PointerTyID' failed.

[8235] signal (6.-6): Aborted
in expression starting at REPL[22]:1
pthread_kill at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
raise at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x70a8e4e2871a)
__assert_fail at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
getNonOpaquePointerElementType at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:388 [inlined]
getPointerElementType at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/Type.h:381 [inlined]
addToInvertedPtrDiffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:838
addToInvertedPtrDiffe at /workspace/srcdir/Enzyme/enzyme/Enzyme/DiffeGradientUtils.cpp:1249
EnzymeGradientUtilsAddToInvertedPointerDiffeTT at /workspace/srcdir/Enzyme/enzyme/Enzyme/CApi.cpp:496
EnzymeGradientUtilsAddToInvertedPointerDiffeTT at /home/ptiede/.julia/dev/Enzyme/src/api.jl:262
unknown function (ip: 0x70a8ca96f00c)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme_custom_common_rev at /home/ptiede/.julia/dev/Enzyme/src/rules/customrules.jl:1074 [inlined]
enzyme_custom_rev at /home/ptiede/.julia/dev/Enzyme/src/rules/customrules.jl:1130
unknown function (ip: 0x70a8ca968255)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme_custom_rev_cfunc at /home/ptiede/.julia/dev/Enzyme/src/rules/llvmrules.jl:27
jfptr_enzyme_custom_rev_cfunc_6731 at /home/ptiede/.julia/compiled/v1.10/Enzyme/G1p5n_Iyla2.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jlcapi_enzyme_custom_rev_cfunc_9200 at /home/ptiede/.julia/compiled/v1.10/Enzyme/G1p5n_Iyla2.so (unknown line)
operator() at /opt/x86_64-linux-gnu/x86_64-linux-gnu/include/c++/10.2.0/bits/std_function.h:622 [inlined]
visitCallInst at /workspace/srcdir/Enzyme/enzyme/Enzyme/AdjointGenerator.h:6276
visit at /opt/x86_64-linux-gnu/x86_64-linux-gnu/sys-root/usr/local/include/llvm/IR/InstVisitor.h:111 [inlined]
CreatePrimalAndGradient at /workspace/srcdir/Enzyme/enzyme/Enzyme/EnzymeLogic.cpp:4396
EnzymeCreatePrimalAndGradient at /workspace/srcdir/Enzyme/enzyme/Enzyme/CApi.cpp:626
EnzymeCreatePrimalAndGradient at /home/ptiede/.julia/dev/Enzyme/src/api.jl:163
unknown function (ip: 0x70a8cad6b44b)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
enzyme! at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:4168
unknown function (ip: 0x70a8cad69b38)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#codegen#18999 at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:6438
codegen at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:5614 [inlined]
_thunk at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7241
_thunk at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7241 [inlined]
cached_compilation at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7282 [inlined]
thunkbase at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7355
unknown function (ip: 0x70a8cad2c690)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#s2080#19052 at /home/ptiede/.julia/dev/Enzyme/src/compiler.jl:7407 [inlined]
#s2080#19052 at ./none:0
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
GeneratedFunctionStub at ./boot.jl:602
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_call_staged at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/method.c:540
ijl_code_for_staged at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/method.c:593
get_staged at ./compiler/utilities.jl:123
retrieve_code_info at ./compiler/utilities.jl:135 [inlined]
InferenceState at ./compiler/inferencestate.jl:430
typeinf_edge at ./compiler/typeinfer.jl:920
abstract_call_method at ./compiler/abstractinterpretation.jl:629
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:95
abstract_call_known at ./compiler/abstractinterpretation.jl:2087
abstract_call at ./compiler/abstractinterpretation.jl:2169
abstract_call at ./compiler/abstractinterpretation.jl:2162
abstract_call at ./compiler/abstractinterpretation.jl:2354
abstract_eval_call at ./compiler/abstractinterpretation.jl:2370
abstract_eval_statement_expr at ./compiler/abstractinterpretation.jl:2380
abstract_eval_statement at ./compiler/abstractinterpretation.jl:2624
abstract_eval_basic_statement at ./compiler/abstractinterpretation.jl:2889
typeinf_local at ./compiler/abstractinterpretation.jl:3098
typeinf_nocycle at ./compiler/abstractinterpretation.jl:3186
_typeinf at ./compiler/typeinfer.jl:247
typeinf at ./compiler/typeinfer.jl:216
typeinf_edge at ./compiler/typeinfer.jl:930
abstract_call_method at ./compiler/abstractinterpretation.jl:629
abstract_call_gf_by_type at ./compiler/abstractinterpretation.jl:95
abstract_call_known at ./compiler/abstractinterpretation.jl:2087
abstract_call at ./compiler/abstractinterpretation.jl:2169
abstract_apply at ./compiler/abstractinterpretation.jl:1612
abstract_call_known at ./compiler/abstractinterpretation.jl:2004
abstract_call at ./compiler/abstractinterpretation.jl:2169
abstract_call at ./compiler/abstractinterpretation.jl:2162
abstract_call at ./compiler/abstractinterpretation.jl:2354
abstract_eval_call at ./compiler/abstractinterpretation.jl:2370
abstract_eval_statement_expr at ./compiler/abstractinterpretation.jl:2380
abstract_eval_statement at ./compiler/abstractinterpretation.jl:2624
abstract_eval_basic_statement at ./compiler/abstractinterpretation.jl:2913
typeinf_local at ./compiler/abstractinterpretation.jl:3098
typeinf_nocycle at ./compiler/abstractinterpretation.jl:3186
_typeinf at ./compiler/typeinfer.jl:247
typeinf at ./compiler/typeinfer.jl:216
typeinf_ext at ./compiler/typeinfer.jl:1051
typeinf_ext_toplevel at ./compiler/typeinfer.jl:1082
typeinf_ext_toplevel at ./compiler/typeinfer.jl:1078
jfptr_typeinf_ext_toplevel_35703.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_type_infer at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:394
jl_generate_fptr_impl at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jitlayers.cpp:504
jl_compile_method_internal at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2481 [inlined]
jl_compile_method_internal at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2368
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2887 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
do_call at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:126
eval_value at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:223
eval_stmt_value at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:174 [inlined]
eval_body at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:617
jl_interpret_toplevel_thunk at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/interpreter.c:775
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:934
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
jl_toplevel_eval_flex at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
eval_user_input at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
repl_backend_loop at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
#start_repl_backend#46 at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
start_repl_backend at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:228
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#run_repl#59 at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
run_repl at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
jfptr_run_repl_91805.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
#1013 at ./client.jl:432
jfptr_YY.1013_82772.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
run_main_repl at ./client.jl:416
exec_options at ./client.jl:333
_start at ./client.jl:552
jfptr__start_82798.1 at /home/ptiede/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/builder-amdci4-4/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
unknown function (ip: 0x70a8e4e29d8f)
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 54270147 (Pool: 54155337; Big: 114810); GC: 51
[1]    8235 IOT instruction (core dumped)  julia

@ptiede
Copy link
Author

ptiede commented Sep 6, 2024

Ok I just corrected reverse so that active variables return a tuple.
The error I get when running the rules are

test_reverse(mul!, BatchDuplicated, (C, BatchDuplicated), (M, Const), (v, BatchDuplicated), (α, Active), (β, Active))
test_reverse: mul! with return activity BatchDuplicated on (::Vector{Float64}, BatchDuplicated), (::SparseMatrixCSC{Float64, Int64}, Const), (::Vector{Float64}, BatchDuplicated), (::Float64, Active), (::Float64, Active): Error During Test at /home/ptiede/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:89
  Got exception outside of a @test
  Enzyme execution failed.
  Enzyme: Reverse pass custom rule Tuple{EnzymeCore.EnzymeRules.ConfigWidth{2, false, true, (false, false, false, false, false, false)}, Const{typeof(mul!)}, Type{BatchDuplicatedNoNeed{Vector{Float64}, 2}}, Tuple{Vector{Float64}, Nothing, Vector{Float64}}, BatchDuplicated{Vector{Float64}, 2}, Const{SparseMatrixCSC{Float64, Int64}}, BatchDuplicated{Vector{Float64}, 2}, Active{Float64}, Active{Float64}} return type mismatch, expected Tuple{Nothing, Nothing, Nothing, Float64, Float64} found Tuple{Nothing, Nothing, Nothing, Tuple{Float64, Float64}, Tuple{Float64, Float64}}
  
  Stacktrace:
    [1] call_with_kwargs
      @ ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:14 [inlined]
    [2] call_with_kwargs
      @ ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:0 [inlined]
    [3] diffe2julia_call_with_kwargs_9896_inner_1wrap
      @ ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:0
    [4] macro expansion
      @ ~/.julia/dev/Enzyme/src/compiler.jl:7187 [inlined]
    [5] enzyme_call(::Val{false}, ::Ptr{Nothing}, ::Type{Enzyme.Compiler.AdjointThunk{Ptr{Nothing}, Const{typeof(EnzymeTestUtils.call_with_kwargs)}, BatchDuplicated{Vector{Float64}}, Tuple{Const{@NamedTuple{}}, Const{typeof(mul!)}, BatchDuplicated{Vector{Float64}, 2}, Const{SparseMatrixCSC{Float64, Int64}}, BatchDuplicated{Vector{Float64}, 2}, Active{Float64}, Active{Float64}}, 2, Tuple{@NamedTuple{1, 2}, @NamedTuple{1, 2}}}}, ::Val{2}, ::Val{false}, ::Type{Tuple{Const{@NamedTuple{}}, Const{typeof(mul!)}, BatchDuplicated{Vector{Float64}, 2}, Const{SparseMatrixCSC{Float64, Int64}}, BatchDuplicated{Vector{Float64}, 2}, Active{Float64}, Active{Float64}}}, ::Type{BatchDuplicated{Vector{Float64}}}, ::Const{typeof(EnzymeTestUtils.call_with_kwargs)}, ::Type{Tuple{@NamedTuple{1, 2}, @NamedTuple{1, 2}}}, ::Const{@NamedTuple{}}, ::Const{typeof(mul!)}, ::BatchDuplicated{Vector{Float64}, 2}, ::Const{SparseMatrixCSC{Float64, Int64}}, ::BatchDuplicated{Vector{Float64}, 2}, ::Active{Float64}, ::Active{Float64}, ::Tuple{@NamedTuple{1, 2}, @NamedTuple{1, 2}})
      @ Enzyme.Compiler ~/.julia/dev/Enzyme/src/compiler.jl:6794
    [6] (::Enzyme.Compiler.AdjointThunk{Ptr{Nothing}, Const{typeof(EnzymeTestUtils.call_with_kwargs)}, BatchDuplicated{Vector{Float64}}, Tuple{Const{@NamedTuple{}}, Const{typeof(mul!)}, BatchDuplicated{Vector{Float64}, 2}, Const{SparseMatrixCSC{Float64, Int64}}, BatchDuplicated{Vector{Float64}, 2}, Active{Float64}, Active{Float64}}, 2, Tuple{@NamedTuple{1, 2}, @NamedTuple{1, 2}}})(::Const{typeof(EnzymeTestUtils.call_with_kwargs)}, ::Const{@NamedTuple{}}, ::Vararg{Any})
      @ Enzyme.Compiler ~/.julia/dev/Enzyme/src/compiler.jl:6677
    [7] macro expansion
      @ ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:147 [inlined]
    [8] macro expansion
      @ ~/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
    [9] test_reverse(::Function, ::Type, ::Tuple{Vector{Float64}, UnionAll}, ::Vararg{Any}; rng::Random.TaskLocalRNG, fdm::FiniteDifferences.AdaptedFiniteDifferenceMethod{5, 1, FiniteDifferences.UnadaptedFiniteDifferenceMethod{7, 5}}, fkwargs::@NamedTuple{}, rtol::Float64, atol::Float64, testset_name::Nothing)
      @ EnzymeTestUtils ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:91
   [10] test_reverse(::Function, ::Type, ::Tuple{Vector{Float64}, UnionAll}, ::Vararg{Any})
      @ EnzymeTestUtils ~/.julia/packages/EnzymeTestUtils/5JRuz/src/test_reverse.jl:74
   [11] top-level scope
      @ REPL[7]:1
   [12] eval
      @ ./boot.jl:385 [inlined]
   [13] eval
      @ ./Base.jl:88 [inlined]
   [14] repleval(m::Module, code::Expr, ::String)
      @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.122.1/scripts/packages/VSCodeServer/src/repl.jl:229
   [15] (::VSCodeServer.var"#112#114"{Module, Expr, REPL.LineEditREPL, REPL.LineEdit.Prompt})()
      @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.122.1/scripts/packages/VSCodeServer/src/repl.jl:192
   [16] with_logstate(f::Function, logstate::Any)
      @ Base.CoreLogging ./logging.jl:515
   [17] with_logger
      @ ./logging.jl:627 [inlined]
   [18] (::VSCodeServer.var"#111#113"{Module, Expr, REPL.LineEditREPL, REPL.LineEdit.Prompt})()
      @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.122.1/scripts/packages/VSCodeServer/src/repl.jl:193
   [19] #invokelatest#2
      @ ./essentials.jl:892 [inlined]
   [20] invokelatest(::Any)
      @ Base ./essentials.jl:889
   [21] (::VSCodeServer.var"#64#65")()
      @ VSCodeServer ~/.vscode/extensions/julialang.language-julia-1.122.1/scripts/packages/VSCodeServer/src/eval.jl:34
Test Summary:                                                                                                                                                                                                               | Pass  Error  Total  Time
test_reverse: mul! with return activity BatchDuplicated on (::Vector{Float64}, BatchDuplicated), (::SparseMatrixCSC{Float64, Int64}, Const), (::Vector{Float64}, BatchDuplicated), (::Float64, Active), (::Float64, Active) |   14      1     15  0.7s

@wsmoses
Copy link
Member

wsmoses commented Sep 6, 2024

Yup that's an error in the error checker, try with #1798

@ptiede
Copy link
Author

ptiede commented Sep 6, 2024

And that fixes it!

@ptiede
Copy link
Author

ptiede commented Sep 12, 2024

@wsmoses is there something I can do to get this moving?

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

Successfully merging this pull request may close these issues.

Sparse matvec seems strangely slow compared to Zygote
2 participants