From 39cf28b9be35fb30d6d2f2d2a97e61b0a234cadd Mon Sep 17 00:00:00 2001 From: Simeon David Schaub Date: Fri, 4 Jul 2025 10:53:12 +0200 Subject: [PATCH 1/2] avoid boxing when `@kernel` is used as a closure This allows uses of `@kernel` inside of functions without running into JuliaLang/julia#53295. One thing I have been wondering though: Is the `@isdefined` check here really necessary? In global scope it should just override the previous definition and for closures these kind of if statements are ignored anyways. --- src/macros.jl | 10 ++++++---- test/test.jl | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/macros.jl b/src/macros.jl index c83d60308..86d5b0bcb 100644 --- a/src/macros.jl +++ b/src/macros.jl @@ -50,12 +50,10 @@ function __kernel(expr, generate_cpu = true, force_inbounds = false, unsafe_indi gpu_function = combinedef(def_gpu) # create constructor functions + _name = Symbol(:_, name) constructors = quote if $(name isa Symbol ? :(!@isdefined($name)) : true) - Core.@__doc__ $name(dev) = $name(dev, $DynamicSize(), $DynamicSize()) - $name(dev, size) = $name(dev, $StaticSize(size), $DynamicSize()) - $name(dev, size, range) = $name(dev, $StaticSize(size), $StaticSize(range)) - function $name(dev::Dev, sz::S, range::NDRange) where {Dev, S <: $_Size, NDRange <: $_Size} + function $_name(dev::Dev, sz::S, range::NDRange) where {Dev, S <: $_Size, NDRange <: $_Size} if $isgpu(dev) return $construct(dev, sz, range, $gpu_name) else @@ -66,6 +64,10 @@ function __kernel(expr, generate_cpu = true, force_inbounds = false, unsafe_indi end end end + Core.@__doc__ $name(dev) = $_name(dev, $DynamicSize(), $DynamicSize()) + $name(dev, size) = $_name(dev, $StaticSize(size), $DynamicSize()) + $name(dev, size, range) = $_name(dev, $StaticSize(size), $StaticSize(range)) + $name(dev, size::$_Size, range::$_Size) = $_name(dev, size, range) end end diff --git a/test/test.jl b/test/test.jl index 4a4f667ab..7de6da0bb 100644 --- a/test/test.jl +++ b/test/test.jl @@ -349,5 +349,20 @@ function unittest_testsuite(Backend, backend_str, backend_mod, BackendArrayT; sk end end + @testset "`@kernel` as a closure" begin + function foo() + @kernel function kernel(A) + i = @index(Global) + A[i] = 1 + end + return kernel + end + ftypes = fieldtypes(typeof(foo())) + @test !any(T -> T <: Core.Box, ftypes) + @test all(ftypes) do T + !any(T -> T <: Core.Box, fieldtypes(T)) + end + end + return end From 3765d276379c5a56ed0b67de4c8105c75a988916 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Fri, 11 Jul 2025 11:22:24 +0200 Subject: [PATCH 2/2] Bump version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index c3f52ea9b..7cba2fb94 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "KernelAbstractions" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" authors = ["Valentin Churavy and contributors"] -version = "0.9.36" +version = "0.9.37" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"