Skip to content

Segfaults/wrong results from matmul! #193

@tam724

Description

@tam724

Follow up on LuxDL/Lux.jl#980.
When running the following script I get the wrong results/segfaults:

using Pkg
Pkg.activate(temp=true)
Pkg.add("Octavian")
using Octavian

N = 3000;
a = ones(10, N);
b = ones(N, 10);

c = zeros(10, 10);
Octavian.matmul!(c, a, b, true, false) # gives wrong results

function my_matmul(a, b)
    c = similar(a, size(a, 1), size(b, 2))
    Octavian.matmul!(c, a, b, true, false)
    return c
end

my_matmul(a, b) # segfaults after running multiple times
run/core dump/versioninfo
julia> versioninfo()
Julia Version 1.11.1
Commit 8f5b7ca12ad (2024-10-16 10:53 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 16 × 11th Gen Intel(R) Core(TM) i9-11950H @ 2.60GHz
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, tigerlake)
Threads: 1 default, 0 interactive, 1 GC (on 16 virtual cores)

julia> using Pkg

julia> Pkg.activate(temp=true)
  Activating new project at `/tmp/jl_2DruNR`

julia> Pkg.add("Octavian")
   Resolving package versions...
    Updating `/tmp/jl_2DruNR/Project.toml`
  [6fd5a793] + Octavian v0.3.28
    Updating `/tmp/jl_2DruNR/Manifest.toml`
  [79e6a3ab] + Adapt v4.0.4
  [4fba245c] + ArrayInterface v7.16.0
  [62783981] + BitTwiddlingConvenienceFunctions v0.1.6
  [2a0fbf3d] + CPUSummary v0.2.6
  [fb6a15b2] + CloseOpenIntervals v0.1.13
  [f70d9fcc] + CommonWorldInvalidations v1.0.0
  [34da2185] + Compat v4.16.0
  [adafc99b] + CpuId v0.3.1
  [ffbed154] + DocStringExtensions v0.9.3
  [3e5b6fbb] + HostCPUFeatures v0.1.17
  [615f187c] + IfElse v0.1.1
  [10f19ff3] + LayoutPointers v0.1.17
  [bdcacae8] + LoopVectorization v0.12.171
  [d125e4d3] + ManualMemory v0.1.8
  [6fd5a793] + Octavian v0.3.28
  [6fe1bfb0] + OffsetArrays v1.14.1
  [1d0040c9] + PolyesterWeave v0.2.2
  [aea7be01] + PrecompileTools v1.2.1
  [21216c6a] + Preferences v1.4.3
  [ae029012] + Requires v1.3.0
  [94e857df] + SIMDTypes v0.1.0
  [476501e8] + SLEEFPirates v0.6.43
  [aedffcd0] + Static v1.1.1
  [0d7ed370] + StaticArrayInterface v1.8.0
  [8290d209] + ThreadingUtilities v0.5.2
  [3a884ed6] + UnPack v1.0.2
  [3d5dd08c] + VectorizationBase v0.21.70
  [56f22d72] + Artifacts v1.11.0
  [2a0f44e3] + Base64 v1.11.0
  [ade2ca70] + Dates v1.11.0
  [76f85450] + LibGit2 v1.11.0
  [8f399da3] + Libdl v1.11.0
  [37e2e46d] + LinearAlgebra v1.11.0
  [d6f4376e] + Markdown v1.11.0
  [ca575930] + NetworkOptions v1.2.0
  [de0858da] + Printf v1.11.0
  [9a3f8284] + Random v1.11.0
  [ea8e919c] + SHA v0.7.0
  [fa267f1f] + TOML v1.0.3
  [cf7118a7] + UUIDs v1.11.0
  [4ec0a83e] + Unicode v1.11.0
  [e66e0078] + CompilerSupportLibraries_jll v1.1.1+0
  [e37daf67] + LibGit2_jll v1.7.2+0
  [29816b5a] + LibSSH2_jll v1.11.0+1
  [c8ffd9c3] + MbedTLS_jll v2.28.6+0
  [4536629a] + OpenBLAS_jll v0.3.27+1
  [8e850b90] + libblastrampoline_jll v5.11.0+0

julia> using Octavian

julia> N = 3000;

julia> a = ones(10, N);

julia> b = ones(N, 10);

julia> c = zeros(10, 10);

julia> Octavian.matmul!(c, a, b, true, false) # gives wrong results
10×10 Matrix{Float64}:
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0
 3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0

julia> function my_matmul(a, b)
           c = similar(a, size(a, 1), size(b, 2))
           Octavian.matmul!(c, a, b, true, false)
           return c
       end
my_matmul (generic function with 1 method)

julia> my_matmul(a, b) # segfaults after running multiple times
10×10 
[186775] signal 11 (128): Segmentation fault
in expression starting at none:0
jl_gc_pool_alloc_inner at /cache/build/builder-demeter6-6/julialang/julia-master/src/gc.c:1335
jl_gc_pool_alloc_noinline at /cache/build/builder-demeter6-6/julialang/julia-master/src/gc.c:1392 [inlined]
jl_gc_alloc_ at /cache/build/builder-demeter6-6/julialang/julia-master/src/julia_internal.h:523 [inlined]
jl_gc_alloc at /cache/build/builder-demeter6-6/julialang/julia-master/src/gc.c:3952
_new_genericmemory_ at /cache/build/builder-demeter6-6/julialang/julia-master/src/genericmemory.c:56 [inlined]
jl_alloc_genericmemory at /cache/build/builder-demeter6-6/julialang/julia-master/src/genericmemory.c:99
ijl_array_grow_end at /cache/build/builder-demeter6-6/julialang/julia-master/src/array.c:229
ijl_module_names at /cache/build/builder-demeter6-6/julialang/julia-master/src/module.c:1001
#unsorted_names#9 at ./reflection.jl:96 [inlined]
unsorted_names at ./reflection.jl:96 [inlined]
make_typealias at ./show.jl:621
show_typealias at ./show.jl:802
_show_type at ./show.jl:967
show at ./show.jl:962
print at ./strings/io.jl:35
showarg at ./show.jl:3209 [inlined]
array_summary at ./show.jl:3152 [inlined]
summary at ./show.jl:3149 [inlined]
show at ./arrayshow.jl:368
unknown function (ip: 0x7f5d54341006)
#68 at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:367
jfptr_YY.68_10032 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
with_repl_linfo at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:661
jfptr_with_repl_linfo_10162 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
display at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:353
display at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:372 [inlined]
display at ./multimedia.jl:340
jfptr_display_13539 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
jl_apply at /cache/build/builder-demeter6-6/julialang/julia-master/src/julia.h:2157 [inlined]
jl_f__call_latest at /cache/build/builder-demeter6-6/julialang/julia-master/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1055 [inlined]
invokelatest at ./essentials.jl:1052 [inlined]
print_response at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:409
#70 at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:378
jfptr_YY.70_10070 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
with_repl_linfo at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:661
jfptr_with_repl_linfo_10162 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
print_response at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:376
do_respond at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:1003
jfptr_do_respond_10225 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
jl_apply at /cache/build/builder-demeter6-6/julialang/julia-master/src/julia.h:2157 [inlined]
jl_f__call_latest at /cache/build/builder-demeter6-6/julialang/julia-master/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1055 [inlined]
invokelatest at ./essentials.jl:1052 [inlined]
run_interface at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/LineEdit.jl:2755
jfptr_run_interface_8706 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
run_frontend at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:1471
#75 at /cache/build/builder-demeter6-6/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:480
jfptr_YY.75_10127 at /home/tamme/.julia/juliaup/julia-1.11.1+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_GYsA8.so (unknown line)
jl_apply at /cache/build/builder-demeter6-6/julialang/julia-master/src/julia.h:2157 [inlined]
start_task at /cache/build/builder-demeter6-6/julialang/julia-master/src/task.c:1202
Allocations: 32345489 (Pool: 32343573; Big: 1916); GC: 25
Segmentation fault (core dumped)

I was able to reproduce this on julia v1.11.0 and v1.10.5 on my machine and reliably on v1.11.0 on another machine.

run different machine
julia> versioninfo()
Julia Version 1.11.0
Commit 501a4f25c2b (2024-10-07 11:40 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 128 × AMD EPYC 9374F 32-Core Processor
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, znver4)
Threads: 1 default, 0 interactive, 1 GC (on 128 virtual cores)

julia> using Pkg

julia> Pkg.activate(temp=true)
  Activating new project at `/tmp/jl_Mfzlrb`

julia> Pkg.add("Octavian")
   Resolving package versions...
    Updating `/tmp/jl_Mfzlrb/Project.toml`
  [6fd5a793] + Octavian v0.3.28
    Updating `/tmp/jl_Mfzlrb/Manifest.toml`
  [79e6a3ab] + Adapt v4.0.4
  [4fba245c] + ArrayInterface v7.16.0
  [62783981] + BitTwiddlingConvenienceFunctions v0.1.6
  [2a0fbf3d] + CPUSummary v0.2.6
  [fb6a15b2] + CloseOpenIntervals v0.1.13
  [f70d9fcc] + CommonWorldInvalidations v1.0.0
  [34da2185] + Compat v4.16.0
  [adafc99b] + CpuId v0.3.1
  [ffbed154] + DocStringExtensions v0.9.3
  [3e5b6fbb] + HostCPUFeatures v0.1.17
  [615f187c] + IfElse v0.1.1
  [10f19ff3] + LayoutPointers v0.1.17
  [bdcacae8] + LoopVectorization v0.12.171
  [d125e4d3] + ManualMemory v0.1.8
  [6fd5a793] + Octavian v0.3.28
  [6fe1bfb0] + OffsetArrays v1.14.1
  [1d0040c9] + PolyesterWeave v0.2.2
  [aea7be01] + PrecompileTools v1.2.1
  [21216c6a] + Preferences v1.4.3
  [ae029012] + Requires v1.3.0
  [94e857df] + SIMDTypes v0.1.0
  [476501e8] + SLEEFPirates v0.6.43
  [aedffcd0] + Static v1.1.1
  [0d7ed370] + StaticArrayInterface v1.8.0
  [8290d209] + ThreadingUtilities v0.5.2
  [3a884ed6] + UnPack v1.0.2
  [3d5dd08c] + VectorizationBase v0.21.70
  [56f22d72] + Artifacts v1.11.0
  [2a0f44e3] + Base64 v1.11.0
  [ade2ca70] + Dates v1.11.0
  [76f85450] + LibGit2 v1.11.0
  [8f399da3] + Libdl v1.11.0
  [37e2e46d] + LinearAlgebra v1.11.0
  [d6f4376e] + Markdown v1.11.0
  [ca575930] + NetworkOptions v1.2.0
  [de0858da] + Printf v1.11.0
  [9a3f8284] + Random v1.11.0
  [ea8e919c] + SHA v0.7.0
  [fa267f1f] + TOML v1.0.3
  [cf7118a7] + UUIDs v1.11.0
  [4ec0a83e] + Unicode v1.11.0
  [e66e0078] + CompilerSupportLibraries_jll v1.1.1+0
  [e37daf67] + LibGit2_jll v1.7.2+0
  [29816b5a] + LibSSH2_jll v1.11.0+1
  [c8ffd9c3] + MbedTLS_jll v2.28.6+0
  [4536629a] + OpenBLAS_jll v0.3.27+1
  [8e850b90] + libblastrampoline_jll v5.11.0+0

julia> using Octavian

julia> N = 3000;

julia> a = ones(10, N);

julia> b = ones(N, 10);

julia> c = zeros(10, 10);

julia> Octavian.matmul!(c, a, b, true, false) # gives wrong results
10×10 Matrix{Float64}:
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  2998.0  3000.0
 3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0
 3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0
 3000.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  2999.0  3000.0

julia> function my_matmul(a, b)
           c = similar(a, size(a, 1), size(b, 2))
           Octavian.matmul!(c, a, b, true, false)
           return c
       end
my_matmul (generic function with 1 method)

julia> my_matmul(a, b) # segfaults after running multiple times
10×10 
[24457] signal 11 (128): Segmentation fault
in expression starting at none:0
jl_gc_pool_alloc_inner at /cache/build/builder-amdci5-1/julialang/julia-master/src/gc.c:1335
jl_gc_pool_alloc_noinline at /cache/build/builder-amdci5-1/julialang/julia-master/src/gc.c:1392 [inlined]
jl_gc_alloc_ at /cache/build/builder-amdci5-1/julialang/julia-master/src/julia_internal.h:523 [inlined]
jl_gc_alloc at /cache/build/builder-amdci5-1/julialang/julia-master/src/gc.c:3952
_new_genericmemory_ at /cache/build/builder-amdci5-1/julialang/julia-master/src/genericmemory.c:56 [inlined]
jl_alloc_genericmemory at /cache/build/builder-amdci5-1/julialang/julia-master/src/genericmemory.c:99
ijl_array_grow_end at /cache/build/builder-amdci5-1/julialang/julia-master/src/array.c:229
ijl_module_names at /cache/build/builder-amdci5-1/julialang/julia-master/src/module.c:1006
#unsorted_names#9 at ./reflection.jl:96 [inlined]
unsorted_names at ./reflection.jl:96 [inlined]
make_typealias at ./show.jl:629
show_typealias at ./show.jl:810
_show_type at ./show.jl:975
show at ./show.jl:970
print at ./strings/io.jl:35
showarg at ./show.jl:3217 [inlined]
array_summary at ./show.jl:3160 [inlined]
summary at ./show.jl:3157 [inlined]
show at ./arrayshow.jl:368
unknown function (ip: 0x7ff42025af26)
#68 at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:348
jfptr_YY.68_10156 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
with_repl_linfo at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:646
jfptr_with_repl_linfo_10298 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
display at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:334
display at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:353 [inlined]
display at ./multimedia.jl:340
jfptr_display_13763 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-master/src/julia.h:2157 [inlined]
jl_f__call_latest at /cache/build/builder-amdci5-1/julialang/julia-master/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1054 [inlined]
invokelatest at ./essentials.jl:1051 [inlined]
print_response at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:390
#70 at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:359
jfptr_YY.70_10194 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
with_repl_linfo at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:646
jfptr_with_repl_linfo_10298 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
print_response at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:357
do_respond at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:988
jfptr_do_respond_10361 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-master/src/julia.h:2157 [inlined]
jl_f__call_latest at /cache/build/builder-amdci5-1/julialang/julia-master/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1054 [inlined]
invokelatest at ./essentials.jl:1051 [inlined]
run_interface at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/LineEdit.jl:2749
jfptr_run_interface_8811 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
run_frontend at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:1456
#75 at /cache/build/builder-amdci5-1/julialang/julia-master/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:461
jfptr_YY.75_10252 at /storage/home/tam/.julia/juliaup/julia-1.11.0+0.x64.linux.gnu/share/julia/compiled/v1.11/REPL/u0gqU_bFCI4.so (unknown line)
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-master/src/julia.h:2157 [inlined]
start_task at /cache/build/builder-amdci5-1/julialang/julia-master/src/task.c:1202
Allocations: 31945795 (Pool: 31943896; Big: 1899); GC: 25
Segmentation fault (core dumped)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions