Skip to content

Segfaults when using Adapt for custom struct with Int as parametric type #684

@alonsoC1s

Description

@alonsoC1s

I'm following the guide in Adapt.jl to use a custom struct as a kernel argument. I modified the example slightly to fit my use case where one of the struct's parametric types is an Int (I use it to dispatch on the "dimension" of the problem)

With that simple change I'm seeing consistent segfaults. Here's a MWE:

using Metal
import Adapt

julia> struct Interpolate{A, D} # D is a stand-in for Val(2)
           xs::A
           ys::A
       end

julia> function (itp::Interpolate)(x)
           i = searchsortedfirst(itp.xs, x)
           i = clamp(i, firstindex(itp.ys), lastindex(itp.ys))
           itp.ys[i]
       end

julia> xs_cpu = [1.f0, 2.f0, 3.f0]
3-element Vector{Float32}:
 1.0
 2.0
 3.0

julia> ys_cpu = [10.f0,20.f0,30.f0]
3-element Vector{Float32}:
 10.0
 20.0
 30.0

julia> itp_cpu = Interpolate{typeof(xs_cpu), 2}(xs_cpu, ys_cpu) # Note the 2 here
Interpolate{Vector{Float32}, 2}(Float32[1.0, 2.0, 3.0], Float32[10.0, 20.0, 30.0])

julia> pts_cpu = [1.f1,2.f3]
2-element Vector{Float32}:
   10.0
 2000.0

julia> result_cpu = itp_cpu.(pts_cpu)
2-element Vector{Float32}:
 30.0
 30.0

julia> itp = Interpolate{typeof(mtl(xs_cpu)), 2}(mtl(xs_cpu), mtl(ys_cpu))
Interpolate{MtlVector{Float32, Metal.PrivateStorage}, 2}(Float32[1.0, 2.0, 3.0], Float32[10.0, 20.0, 30.0])

julia> pts = mtl(pts_cpu)
2-element MtlVector{Float32, Metal.PrivateStorage}:
   10.0
 2000.0

julia> function Adapt.adapt_structure(to, itp::Interpolate{A,D}) where {A,D}
           xs = Adapt.adapt_structure(to, itp.xs)
           ys = Adapt.adapt_structure(to, itp.ys)
           Interpolate{A,D}(xs, ys)
       end

The segfault occurs when the function is called:

julia> itp.(pts)
[3494] signal 10 (1): Bus error: 10
in expression starting at REPL[24]:1
macro expansion at /Users/alonsoc1s/.julia/packages/LLVM/UFrs4/src/interop/base.jl:39 [inlined]
macro expansion at ./none:0 [inlined]
pointerref at ./none:0 [inlined]
unsafe_load at /Users/alonsoc1s/.julia/packages/LLVM/UFrs4/src/interop/pointer.jl:85 [inlined]
arrayref at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/device/array.jl:82 [inlined]
getindex at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/device/array.jl:103 [inlined]
copyto_unaliased! at ./abstractarray.jl:1081 [inlined]
copyto! at ./abstractarray.jl:1061 [inlined]
copyto_axcheck! at ./abstractarray.jl:1167
Array at ./array.jl:626 [inlined]
Array at ./boot.jl:606 [inlined]
convert at ./array.jl:618 [inlined]
MtlArray at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/array.jl:295 [inlined]
convert at /Users/alonsoc1s/.julia/packages/GPUArrays/u6tui/src/host/construction.jl:4 [inlined]
Interpolate at ./REPL[5]:2
adapt_structure at ./REPL[23]:4 [inlined]
adapt at /Users/alonsoc1s/.julia/packages/Adapt/2UZ81/src/Adapt.jl:40 [inlined]
adapt_structure at /Users/alonsoc1s/.julia/packages/Adapt/2UZ81/src/base.jl:62 [inlined]
adapt at /Users/alonsoc1s/.julia/packages/Adapt/2UZ81/src/Adapt.jl:40 [inlined]
mtlconvert at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/compiler/execution.jl:156 [inlined]
mtlconvert at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/compiler/execution.jl:156 [inlined]
map at ./tuple.jl:356 [inlined]
macro expansion at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/compiler/execution.jl:83 [inlined]
_copyto! at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/broadcast.jl:104 [inlined]
copyto! at /Users/alonsoc1s/.julia/packages/Metal/Pwc41/src/broadcast.jl:52 [inlined]
copy at /Users/alonsoc1s/.julia/packages/GPUArrays/u6tui/src/host/broadcast.jl:29 [inlined]
materialize at ./broadcast.jl:872
unknown function (ip: 0x34d548ba3)
jl_apply at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/./julia.h:2157 [inlined]
do_call at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:126
eval_stmt_value at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:174
eval_body at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:666
jl_interpret_toplevel_thunk at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:824
jl_toplevel_eval_flex at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:943
jl_toplevel_eval_flex at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:886
jl_toplevel_eval_flex at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:886
jl_toplevel_eval_flex at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:886
eval_body at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:628
eval_body at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:539
jl_interpret_toplevel_thunk at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/interpreter.c:824
jl_toplevel_eval_flex at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:943
ijl_toplevel_eval at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:952 [inlined]
ijl_toplevel_eval_in at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/toplevel.c:994
eval at ./boot.jl:430 [inlined]
eval_user_input at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:261
repl_backend_loop at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:368
#start_repl_backend#59 at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:343
start_repl_backend at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:340
#run_repl#76 at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:500
run_repl at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/usr/share/julia/stdlib/v1.11/REPL/src/REPL.jl:486
jfptr_run_repl_10112.1 at /Users/alonsoc1s/.julia/juliaup/julia-1.11.5+0.aarch64.apple.darwin14/share/julia/compiled/v1.11/REPL/u0gqU_RnzCd.dylib (unknown line)
#1150 at ./client.jl:446
jfptr_YY.1150_14703.1 at /Users/alonsoc1s/.julia/juliaup/julia-1.11.5+0.aarch64.apple.darwin14/share/julia/compiled/v1.11/REPL/u0gqU_RnzCd.dylib (unknown line)
jl_apply at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/./julia.h:2157 [inlined]
jl_f__call_latest at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/builtins.c:875
#invokelatest#2 at ./essentials.jl:1055 [inlined]
invokelatest at ./essentials.jl:1052 [inlined]
run_main_repl at ./client.jl:430
repl_main at ./client.jl:567 [inlined]
_start at ./client.jl:541
jfptr__start_73721.1 at /Users/alonsoc1s/.julia/juliaup/julia-1.11.5+0.aarch64.apple.darwin14/lib/julia/sys.dylib (unknown line)
jl_apply at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/./julia.h:2157 [inlined]
true_main at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/jlapi.c:900
jl_repl_entrypoint at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-honeycrisp-HL2F7YQ3XH.0/build/default-honeycrisp-HL2F7YQ3XH-0/julialang/julia-release-1-dot-11/src/jlapi.c:1059
Allocations: 87638048 (Pool: 87626861; Big: 11187); GC: 141
[1]    3494 bus error  julia --project

This is my versioninfo:

macOS 15.7.1, Darwin 24.6.0

Toolchain:
- Julia: 1.11.5
- LLVM: 16.0.6

Julia packages:
- Metal.jl: 1.6.4
- GPUArrays: 11.2.3
- GPUCompiler: 1.6.1
- KernelAbstractions: 0.9.38
- ObjectiveC: 3.4.2
- LLVM: 9.4.2
- LLVMDowngrader_jll: 0.6.0+1

1 device:
- Apple M2 (64.000 KiB allocated)

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