From dc0c075a0d4eaff44457ecf10bf2ebba5121c6d4 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 09:53:23 +0000 Subject: [PATCH 01/40] version to 1.0.0, change author info --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 5212bb6..e14558f 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "FFTRegGPU" uuid = "86d2b4ce-0b7d-4e3e-98ec-23077478530b" authors = ["Jungsoo Kim "] -version = "0.1.0" +version = "1.0.0" [deps] AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" From 399f945a2874ea0a8cc18f2c8c985a2322de8ec4 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:00:38 +0000 Subject: [PATCH 02/40] adjust the author info --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index e14558f..ef2e5b3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "FFTRegGPU" uuid = "86d2b4ce-0b7d-4e3e-98ec-23077478530b" -authors = ["Jungsoo Kim "] +authors = ["urlicht "] version = "1.0.0" [deps] From 11d205cf987b3b1b3b559444e77ea35b079fc740 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:04:31 +0000 Subject: [PATCH 03/40] Refactor core registration code to be backend agnostic --- src/FFTRegGPU.jl | 21 +++- src/dftreg_translate.jl | 218 ++++++++++++++++++++++++---------------- 2 files changed, 145 insertions(+), 94 deletions(-) diff --git a/src/FFTRegGPU.jl b/src/FFTRegGPU.jl index 708b98a..1fe30fb 100644 --- a/src/FFTRegGPU.jl +++ b/src/FFTRegGPU.jl @@ -1,11 +1,22 @@ module FFTRegGPU -using CUDA, AbstractFFTs +using AbstractFFTs include("dftreg_translate.jl") -export dftreg_gpu!, - subpix_shift_gpu!, - dftreg_resample_gpu!, - reg_stack_translate! +export dftreg!, + dftreg_subpix!, + subpix_shift!, + dftreg_resample!, + reg_stack_translate!, + dftreg_gpu!, + dftreg_subpix_gpu!, + subpix_shift_gpu!, + dftreg_resample_gpu! + +# Backward-compatible wrappers around the backend-agnostic API. +dftreg_gpu!(args...) = dftreg!(args...) +dftreg_subpix_gpu!(args...) = dftreg_subpix!(args...) +subpix_shift_gpu!(args...) = subpix_shift!(args...) +dftreg_resample_gpu!(args...) = dftreg_resample!(args...) end # module diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index c37f285..8367ac8 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -1,64 +1,89 @@ -function dftups(inp::AbstractArray{T,N},no,usfac::Int=1,offset=zeros(N)) where {T,N} +_fft(inp::AbstractArray) = fft(inp) +_ifft(inp::AbstractArray) = ifft(inp) +_fftshift(inp::AbstractArray) = fftshift(inp) +_ifftshift(inp::AbstractArray) = ifftshift(inp) + +function dftups(inp::AbstractArray{T,N}, no, usfac::Int=1, offset=zeros(N)) where {T,N} sz = [size(inp)...] permV = 1:N for i in permV - inp = permutedims(inp,[i;deleteat!(collect(permV),i)]) - kern = exp.((-1im*2*pi/(sz[i]*usfac))*((0:(no-1)).-offset[i])*transpose(ifftshift(0:(sz[i]-1)).-floor(sz[i]/2))) + inp = permutedims(inp, [i; deleteat!(collect(permV), i)]) + kern = exp.( + (-1im * 2 * pi / (sz[i] * usfac)) * + ((0:(no - 1)) .- offset[i]) * + transpose(ifftshift(0:(sz[i] - 1)) .- floor(sz[i] / 2)), + ) d = size(inp)[2:N] inp = kern * reshape(inp, Val(2)) - inp = reshape(inp,(no,d...)) + inp = reshape(inp, (no, d...)) end - permutedims(inp,collect(ndims(inp):-1:1)) + permutedims(inp, collect(ndims(inp):-1:1)) end -function dftreg_gpu!(img1_f_g::CuArray{Complex{Float32},2}, img2_f_g::CuArray{Complex{Float32},2}, - CC_g::CuArray{Complex{Float32},2}) - L = length(img1_f_g) - CC_g .= CUFFT.ifft(img1_f_g .* CUDA.conj(img2_f_g)) - loc = argmax(abs.(CC_g)) - CCmax = Array(CC_g)[loc] - rfzero = sum(abs2, img1_f_g) / L - rgzero = sum(abs2, img2_f_g) / L - error = abs(1 - CCmax * conj(CCmax) / (rgzero * rfzero)) - diffphase = atan(imag(CCmax),real(CCmax)) +function dftreg!( + img1_f::AbstractMatrix{<:Complex}, + img2_f::AbstractMatrix{<:Complex}, + CC::AbstractMatrix{<:Complex}, +) + size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) + size(img1_f) == size(CC) || throw(DimensionMismatch("CC must have the same size as img1_f")) - indi = size(img1_f_g) - ind2 = tuple([div(x,2) for x in indi]...) + L = length(img1_f) + CC .= _ifft(img1_f .* conj.(img2_f)) + loc = argmax(abs.(CC)) + CCmax = Array(CC)[loc] + rfzero = sum(abs2, img1_f) / L + rgzero = sum(abs2, img2_f) / L + error = abs(1 - CCmax * conj(CCmax) / (rgzero * rfzero)) + diffphase = atan(imag(CCmax), real(CCmax)) - locI = [Tuple(loc)...] + indi = size(img1_f) + ind2 = tuple([div(x, 2) for x in indi]...) + locI = Tuple(loc) + shift = zeros(Float64, length(locI)) - shift = zeros(size(locI)) - for i = eachindex(locI) - if locI[i]>ind2[i] - shift[i]=locI[i]-indi[i]-1 - else shift[i]=locI[i]-1 + for i in eachindex(locI) + if locI[i] > ind2[i] + shift[i] = locI[i] - indi[i] - 1 + else + shift[i] = locI[i] - 1 end end - + error, shift, diffphase end -function dftreg_subpix_gpu!(img1_f_g::CuArray{Complex{Float32},2}, img2_f_g::CuArray{Complex{Float32},2}, - CC2x_g::CuArray{Complex{Float32},2}, up_fac::Int=10) - ## initial estimate by 2x upsample - # embed 2x fft - dim_input = collect(size(img1_f_g)) - ranges = [(x+1-div(x,2)):(x+1+div(x-1,2)) for x in dim_input] - CC2x_g .= 0 - CC2x_g[ranges...] .= CUFFT.fftshift(img1_f_g) .* CUFFT.conj(CUFFT.fftshift(img2_f_g)) +function dftreg_subpix!( + img1_f::AbstractMatrix{<:Complex}, + img2_f::AbstractMatrix{<:Complex}, + CC2x::AbstractMatrix{<:Complex}, + up_fac::Int=10, +) + size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) + up_fac > 0 || throw(ArgumentError("up_fac must be positive")) + + # initial estimate by 2x upsample + dim_input = collect(size(img1_f)) + ranges = [(x + 1 - div(x, 2)):(x + 1 + div(x - 1, 2)) for x in dim_input] + expected_cc_size = tuple((2 .* dim_input)...) + size(CC2x) == expected_cc_size || + throw(DimensionMismatch("CC2x must have size $(expected_cc_size), got $(size(CC2x))")) + + CC2x .= 0 + CC2x[ranges...] .= _fftshift(img1_f) .* conj.(_fftshift(img2_f)) # compute cross-correlation and locate the peak - CC2x_g = CUFFT.ifft(CUFFT.ifftshift(CC2x_g)) - loc = argmax(abs.(CC2x_g)) + CC2x_corr = _ifft(_ifftshift(CC2x)) + loc = argmax(abs.(CC2x_corr)) - indi = size(CC2x_g) + indi = size(CC2x_corr) locI = collect(Tuple(loc)) - CC2x_max = Array(CC2x_g)[loc] + CC2x_max = Array(CC2x_corr)[loc] # obtain shift in original pixel grid ind2 = indi ./ 2 - shift = zeros(size(locI)) - for i = eachindex(locI) + shift = zeros(Float64, length(locI)) + for i in eachindex(locI) if locI[i] > ind2[i] shift[i] = locI[i] - indi[i] - 1 else @@ -67,88 +92,103 @@ function dftreg_subpix_gpu!(img1_f_g::CuArray{Complex{Float32},2}, img2_f_g::CuA end shift = shift / 2 - ## refine subpixel estimation + # refine subpixel estimation if up_fac > 2 - # refine the estimate with matrix multiply DFT shift = round.(Int, shift * up_fac) / up_fac # initial shift estimate dft_shift = ceil(up_fac * 1.5) / 2 # center of output at dft_shift + 1 - # mat multiplies dft around the current shift estimate - CC_refine = dftups(Array(img2_f_g .* CUFFT.conj(img1_f_g)), ceil(Int, up_fac * 1.5), - up_fac, dft_shift .- shift * up_fac) / (prod(ind2) * up_fac ^ 2) + CC_refine = dftups( + Array(img2_f .* conj.(img1_f)), + ceil(Int, up_fac * 1.5), + up_fac, + dft_shift .- shift .* up_fac, + ) / (prod(ind2) * up_fac ^ 2) - # locate max and map back to the original grid loc = argmax(abs.(CC_refine)) locI = Tuple(loc) CC_refine_max = CC_refine[loc] locI = locI .- dft_shift .- 1 shift = shift .+ locI ./ up_fac - - img1_00 = dftups(Array(img1_f_g .* CUFFT.conj(img1_f_g)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) - img2_00 = dftups(Array(img2_f_g .* CUFFT.conj(img2_f_g)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) + + img1_00 = dftups(Array(img1_f .* conj.(img1_f)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) + img2_00 = dftups(Array(img2_f .* conj.(img2_f)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) CC_max = CC_refine_max else - img1_00 = sum(img1_f_g .* CUFFT.conj(img1_f_g)) / prod(indi) - img2_00 = sum(img2_f_g .* CUFFT.conj(img2_f_g)) / prod(indi) + img1_00 = sum(img1_f .* conj.(img1_f)) / prod(indi) + img2_00 = sum(img2_f .* conj.(img2_f)) / prod(indi) CC_max = CC2x_max end - + error = 1 - CC_max * conj(CC_max) / (img1_00 * img2_00) - error = sqrt(abs.(error)) + error = sqrt(abs(error)) diffphase = atan(imag(CC_max), real(CC_max)) - + error, shift, diffphase end -function subpix_shift_gpu!(img_f_g::CuArray{Complex{Float32},2}, N_g::CuArray{Float32,2}, shift, diffphase) - sz = [size(img_f_g)...] - N_ = Float32(0) - for i = eachindex(sz) - shifti = ifftshift((-div(sz[i],2)):(ceil(Integer,sz[i]/2)-1))*shift[i]/sz[i] - resh = (repeat([1],inner=[i-1])...,length(shifti)) - N_ = N_ .- Float32.(reshape(shifti,resh)) +function subpix_shift!( + img_f::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}, + shift, + diffphase, +) + size(img_f) == size(N) || throw(DimensionMismatch("N must have the same size as img_f")) + + sz = [size(img_f)...] + T = float(real(eltype(img_f))) + N_ = zero(T) + + for i in eachindex(sz) + shifti = ifftshift((-div(sz[i], 2)):(ceil(Int, sz[i] / 2) - 1)) * shift[i] / sz[i] + resh = (ntuple(_ -> 1, i - 1)..., length(shifti)) + N_ = N_ .- T.(reshape(shifti, resh)) end - - copyto!(N_g, N_) - exp(1im * diffphase) .* (img_f_g .* exp.(Complex{Float32}(2im * pi) * N_g)) + + copyto!(N, N_) + phase = cis(T(diffphase)) + twopi_im = complex(zero(T), T(2 * pi)) + phase .* (img_f .* exp.(twopi_im .* N)) end -function dftreg_resample_gpu!(img_f_g::CuArray{Complex{Float32}, 2}, N_g::CuArray{Float32,2}, shift, diffphase) - real(CUFFT.ifft(subpix_shift_gpu!(img_f_g, N_g, shift, diffphase))) +function dftreg_resample!( + img_f::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}, + shift, + diffphase, +) + real(_ifft(subpix_shift!(img_f, N, shift, diffphase))) end -function reg_stack_translate!(img_stack_reg_g::CuArray{Float32,3}, img1_f_g::CuArray{Complex{Float32},2}, - img2_f_g::CuArray{Complex{Float32},2}, CC2x_g::CuArray{Complex{Float32},2}, - N_g::CuArray{Float32,2}; reg_param::Dict) - size_x, size_y, size_z = size(img_stack_reg_g) - # reset arrays - CC2x_g .= 0 - N_g .= 0 - - # register +function reg_stack_translate!( + img_stack_reg::AbstractArray{<:Real,3}, + img1_f::AbstractMatrix{<:Complex}, + img2_f::AbstractMatrix{<:Complex}, + CC2x::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}; + reg_param::AbstractDict{<:Integer}=Dict{Int,Any}(), +) + _, _, size_z = size(img_stack_reg) + CC2x .= zero(eltype(CC2x)) + N .= zero(eltype(N)) + for z = 2:size_z z1, z2 = z - 1, z - # copy data and fft - img1_g = view(img_stack_reg_g, :,:,z1) - img2_g = view(img_stack_reg_g, :,:,z2) - img1_f_g .= CUFFT.fft(img1_g) - img2_f_g .= CUFFT.fft(img2_g) + img1 = view(img_stack_reg, :, :, z1) + img2 = view(img_stack_reg, :, :, z2) + img1_f .= _fft(img1) + img2_f .= _fft(img2) - # register if !haskey(reg_param, z) - error, shift, diffphase = dftreg_subpix_gpu!(img1_f_g, img2_f_g, CC2x_g) + error, shift, diffphase = dftreg_subpix!(img1_f, img2_f, CC2x) reg_param[z] = (error, shift, diffphase) else error, shift, diffphase = reg_param[z] end - - # resample - img_stack_reg_g[:,:,z] .= dftreg_resample_gpu!(img2_f_g, N_g, shift, diffphase) - - # reset arrays - CC2x_g .= 0 - N_g .= 0 + + img_stack_reg[:, :, z] .= dftreg_resample!(img2_f, N, shift, diffphase) + CC2x .= zero(eltype(CC2x)) + N .= zero(eltype(N)) end - + nothing -end \ No newline at end of file +end From e451d2130182095e1c7f10d7cdec5acfc59415fb Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:06:42 +0000 Subject: [PATCH 04/40] Add CPU/CUDA backend extensions and optional CUDA dependency --- Project.toml | 7 +++++++ README.md | 31 ++++++++++++++++++++----------- ext/FFTRegGPUCPUExt.jl | 14 ++++++++++++++ ext/FFTRegGPUCUDAExt.jl | 18 ++++++++++++++++++ 4 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 ext/FFTRegGPUCPUExt.jl create mode 100644 ext/FFTRegGPUCUDAExt.jl diff --git a/Project.toml b/Project.toml index ef2e5b3..b0f5c40 100644 --- a/Project.toml +++ b/Project.toml @@ -5,4 +5,11 @@ version = "1.0.0" [deps] AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" + +[weakdeps] CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + +[extensions] +FFTRegGPUCUDAExt = "CUDA" +FFTRegGPUCPUExt = "FFTW" diff --git a/README.md b/README.md index ededdfd..72bcca2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ # FFTRegGPU.jl -Fast FFT GPU registrtion using [phase correlation](https://en.wikipedia.org/wiki/Phase_correlation). This GPU version is based on [SubpixelRegistration.jl](https://github.com/romainFr/SubpixelRegistration.jl) +Fast FFT GPU registration using [phase correlation](https://en.wikipedia.org/wiki/Phase_correlation). This GPU version is based on [SubpixelRegistration.jl](https://github.com/romainFr/SubpixelRegistration.jl) Currently it only supports translation. ## Usage and example +### Backend setup +Load FFTRegGPU with the backend package you want to use: + +```julia +using FFTRegGPU +using FFTW # CPU backend +# using CUDA # CUDA backend +``` + ### Registering a set of 2D images ```julia # allocate GPU memory @@ -18,15 +27,15 @@ N_g = CuArray{Float32}(undef, size_x, size_y) copyto!(img1_g, Float32.(img1)) copyto!(img2_g, Float32.(img2)) -# perform FFT using CUFFT -img1_f_g .= CUFFT.fft(img1_g) -img2_f_g .= CUFFT.fft(img2_g) +# perform FFT using the active backend +img1_f_g .= fft(img1_g) +img2_f_g .= fft(img2_g) # register (find the optimal translation) -error, shift, diffphase = dftreg_gpu!(img1_f_g, img2_f_g, CC_g) +error, shift, diffphase = dftreg!(img1_f_g, img2_f_g, CC_g) # resample the moving image -img2_reg_g = dftreg_resample_gpu!(img1_f_g, N_g, shift, diffphase) +img2_reg_g = dftreg_resample!(img2_f_g, N_g, shift, diffphase) # copy to CPU Array(img2_reg_g) @@ -46,15 +55,15 @@ N_g = CuArray{Float32}(undef, size_x, size_y) copyto!(img1_g, Float32.(img1)) copyto!(img2_g, Float32.(img2)) -# perform FFT using CUFFT -img1_f_g .= CUFFT.fft(img1_g) -img2_f_g .= CUFFT.fft(img2_g) +# perform FFT using the active backend +img1_f_g .= fft(img1_g) +img2_f_g .= fft(img2_g) # register (find the optimal translation) -error, shift, diffphase = dftreg_subpix_gpu!(img1_f_g, img2_f_g, CC2x_g) +error, shift, diffphase = dftreg_subpix!(img1_f_g, img2_f_g, CC2x_g) # resample the moving image -img2_reg_g = dftreg_resample_gpu!(img1_f_g, N_g, shift, diffphase) +img2_reg_g = dftreg_resample!(img2_f_g, N_g, shift, diffphase) # copy to CPU Array(img2_reg_g) diff --git a/ext/FFTRegGPUCPUExt.jl b/ext/FFTRegGPUCPUExt.jl new file mode 100644 index 0000000..8798fa5 --- /dev/null +++ b/ext/FFTRegGPUCPUExt.jl @@ -0,0 +1,14 @@ +module FFTRegGPUCPUExt + +using FFTRegGPU +using FFTW +using AbstractFFTs + +import FFTRegGPU: _fft, _ifft, _fftshift, _ifftshift + +_fft(inp::StridedArray) = FFTW.fft(inp) +_ifft(inp::StridedArray) = FFTW.ifft(inp) +_fftshift(inp::StridedArray) = AbstractFFTs.fftshift(inp) +_ifftshift(inp::StridedArray) = AbstractFFTs.ifftshift(inp) + +end diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl new file mode 100644 index 0000000..527033f --- /dev/null +++ b/ext/FFTRegGPUCUDAExt.jl @@ -0,0 +1,18 @@ +module FFTRegGPUCUDAExt + +using FFTRegGPU +using CUDA + +import FFTRegGPU: _fft, _ifft, _fftshift, _ifftshift + +_fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) +_ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) +_fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) +_ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) + +_fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) +_ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) +_fftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fftshift(inp) +_ifftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifftshift(inp) + +end From 29102e6b2518f3a8226434f7d7c779cfa9b10d8b Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:26:43 +0000 Subject: [PATCH 05/40] Optimize by eliminating GPU host copies and adding true in-place resampling --- ext/FFTRegGPUCPUExt.jl | 2 + ext/FFTRegGPUCUDAExt.jl | 5 +- src/FFTRegGPU.jl | 4 +- src/dftreg_translate.jl | 199 ++++++++++++++++++++++++++++------------ 4 files changed, 147 insertions(+), 63 deletions(-) diff --git a/ext/FFTRegGPUCPUExt.jl b/ext/FFTRegGPUCPUExt.jl index 8798fa5..b9bc94f 100644 --- a/ext/FFTRegGPUCPUExt.jl +++ b/ext/FFTRegGPUCPUExt.jl @@ -5,9 +5,11 @@ using FFTW using AbstractFFTs import FFTRegGPU: _fft, _ifft, _fftshift, _ifftshift +import FFTRegGPU: _ifft! _fft(inp::StridedArray) = FFTW.fft(inp) _ifft(inp::StridedArray) = FFTW.ifft(inp) +_ifft!(inp::StridedArray{<:Complex}) = FFTW.ifft!(inp) _fftshift(inp::StridedArray) = AbstractFFTs.fftshift(inp) _ifftshift(inp::StridedArray) = AbstractFFTs.ifftshift(inp) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 527033f..57a1a4f 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -3,16 +3,19 @@ module FFTRegGPUCUDAExt using FFTRegGPU using CUDA -import FFTRegGPU: _fft, _ifft, _fftshift, _ifftshift +import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) +_ifft!(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.ifft!(inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) +_scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] _fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) _ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) _fftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifftshift(inp) +_scalar_at(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, idx) = CUDA.@allowscalar inp[idx] end diff --git a/src/FFTRegGPU.jl b/src/FFTRegGPU.jl index 1fe30fb..6271da0 100644 --- a/src/FFTRegGPU.jl +++ b/src/FFTRegGPU.jl @@ -6,6 +6,7 @@ include("dftreg_translate.jl") export dftreg!, dftreg_subpix!, subpix_shift!, + dftreg_resample, dftreg_resample!, reg_stack_translate!, dftreg_gpu!, @@ -17,6 +18,7 @@ export dftreg!, dftreg_gpu!(args...) = dftreg!(args...) dftreg_subpix_gpu!(args...) = dftreg_subpix!(args...) subpix_shift_gpu!(args...) = subpix_shift!(args...) -dftreg_resample_gpu!(args...) = dftreg_resample!(args...) +dftreg_resample_gpu(args...; kwargs...) = dftreg_resample(args...; kwargs...) +dftreg_resample_gpu!(args...; kwargs...) = dftreg_resample!(args...; kwargs...) end # module diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index 8367ac8..ad0124d 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -1,46 +1,73 @@ _fft(inp::AbstractArray) = fft(inp) _ifft(inp::AbstractArray) = ifft(inp) +_ifft!(inp::AbstractArray) = copyto!(inp, _ifft(inp)) _fftshift(inp::AbstractArray) = fftshift(inp) _ifftshift(inp::AbstractArray) = ifftshift(inp) +_scalar_at(inp::AbstractArray, idx) = inp[idx] -function dftups(inp::AbstractArray{T,N}, no, usfac::Int=1, offset=zeros(N)) where {T,N} - sz = [size(inp)...] +_backend_template(inp::AbstractArray) = inp +_backend_template(inp::SubArray) = _backend_template(parent(inp)) +_backend_template(inp::Base.ReshapedArray) = _backend_template(parent(inp)) +_backend_template(inp::Base.PermutedDimsArray) = _backend_template(parent(inp)) + +function _to_backend(ref::AbstractArray, src::AbstractArray) + tmpl = _backend_template(ref) + out = similar(tmpl, eltype(src), size(src)) + copyto!(out, src) + out +end + +function dftups(inp::AbstractArray{T,N}, no::Integer, usfac::Int=1, offset=nothing) where {T<:Number,N} + no > 0 || throw(ArgumentError("no must be positive")) + usfac > 0 || throw(ArgumentError("usfac must be positive")) + + Treal = float(real(T)) + offset_vals = offset === nothing ? ntuple(_ -> zero(Treal), N) : ntuple(i -> Treal(offset[i]), N) + + sz = ntuple(i -> size(inp, i), N) permV = 1:N + out = inp for i in permV - inp = permutedims(inp, [i; deleteat!(collect(permV), i)]) - kern = exp.( - (-1im * 2 * pi / (sz[i] * usfac)) * - ((0:(no - 1)) .- offset[i]) * - transpose(ifftshift(0:(sz[i] - 1)) .- floor(sz[i] / 2)), - ) - d = size(inp)[2:N] - inp = kern * reshape(inp, Val(2)) - inp = reshape(inp, (no, d...)) + out = permutedims(out, [i; deleteat!(collect(permV), i)]) + + row = Treal.(0:(no - 1)) .- offset_vals[i] + col = Treal.(ifftshift(0:(sz[i] - 1)) .- div(sz[i], 2)) + phase = -complex(zero(Treal), Treal(2 * pi / (sz[i] * usfac))) + kern_host = exp.(phase .* (row * transpose(col))) + kern = _to_backend(out, convert.(eltype(out), kern_host)) + + d = size(out)[2:N] + out = kern * reshape(out, Val(2)) + out = reshape(out, (no, d...)) end - permutedims(inp, collect(ndims(inp):-1:1)) + permutedims(out, collect(ndims(out):-1:1)) end function dftreg!( - img1_f::AbstractMatrix{<:Complex}, - img2_f::AbstractMatrix{<:Complex}, - CC::AbstractMatrix{<:Complex}, -) + img1_f::AbstractMatrix{T1}, + img2_f::AbstractMatrix{T2}, + CC::AbstractMatrix{TC}, +) where {T1<:Complex,T2<:Complex,TC<:Complex} size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) size(img1_f) == size(CC) || throw(DimensionMismatch("CC must have the same size as img1_f")) - L = length(img1_f) - CC .= _ifft(img1_f .* conj.(img2_f)) - loc = argmax(abs.(CC)) - CCmax = Array(CC)[loc] + Treal = float(real(promote_type(T1, T2, TC))) + L = Treal(length(img1_f)) + + @. CC = img1_f * conj(img2_f) + _ifft!(CC) + + _, loc = findmax(abs, CC) + CCmax = _scalar_at(CC, loc) rfzero = sum(abs2, img1_f) / L rgzero = sum(abs2, img2_f) / L - error = abs(1 - CCmax * conj(CCmax) / (rgzero * rfzero)) - diffphase = atan(imag(CCmax), real(CCmax)) + error = abs(one(Treal) - CCmax * conj(CCmax) / (rgzero * rfzero)) + diffphase = Treal(atan(imag(CCmax), real(CCmax))) indi = size(img1_f) - ind2 = tuple([div(x, 2) for x in indi]...) + ind2 = ntuple(i -> div(indi[i], 2), length(indi)) locI = Tuple(loc) - shift = zeros(Float64, length(locI)) + shift = zeros(Treal, length(locI)) for i in eachindex(locI) if locI[i] > ind2[i] @@ -54,35 +81,39 @@ function dftreg!( end function dftreg_subpix!( - img1_f::AbstractMatrix{<:Complex}, - img2_f::AbstractMatrix{<:Complex}, - CC2x::AbstractMatrix{<:Complex}, + img1_f::AbstractMatrix{T1}, + img2_f::AbstractMatrix{T2}, + CC2x::AbstractMatrix{TC}, up_fac::Int=10, -) +) where {T1<:Complex,T2<:Complex,TC<:Complex} size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) up_fac > 0 || throw(ArgumentError("up_fac must be positive")) + Treal = float(real(promote_type(T1, T2, TC))) # initial estimate by 2x upsample - dim_input = collect(size(img1_f)) + dim_input = size(img1_f) ranges = [(x + 1 - div(x, 2)):(x + 1 + div(x - 1, 2)) for x in dim_input] - expected_cc_size = tuple((2 .* dim_input)...) + expected_cc_size = ntuple(i -> 2 * dim_input[i], length(dim_input)) size(CC2x) == expected_cc_size || throw(DimensionMismatch("CC2x must have size $(expected_cc_size), got $(size(CC2x))")) - CC2x .= 0 - CC2x[ranges...] .= _fftshift(img1_f) .* conj.(_fftshift(img2_f)) + CC2x .= zero(eltype(CC2x)) + img1_shift = _fftshift(img1_f) + img2_shift = _fftshift(img2_f) + @views @. CC2x[ranges...] = img1_shift * conj(img2_shift) # compute cross-correlation and locate the peak - CC2x_corr = _ifft(_ifftshift(CC2x)) - loc = argmax(abs.(CC2x_corr)) + copyto!(CC2x, _ifftshift(CC2x)) + _ifft!(CC2x) + _, loc = findmax(abs, CC2x) - indi = size(CC2x_corr) + indi = size(CC2x) locI = collect(Tuple(loc)) - CC2x_max = Array(CC2x_corr)[loc] + CC2x_max = _scalar_at(CC2x, loc) # obtain shift in original pixel grid - ind2 = indi ./ 2 - shift = zeros(Float64, length(locI)) + ind2 = Treal.(indi) ./ Treal(2) + shift = zeros(Treal, length(locI)) for i in eachindex(locI) if locI[i] > ind2[i] shift[i] = locI[i] - indi[i] - 1 @@ -94,24 +125,25 @@ function dftreg_subpix!( # refine subpixel estimation if up_fac > 2 - shift = round.(Int, shift * up_fac) / up_fac # initial shift estimate - dft_shift = ceil(up_fac * 1.5) / 2 # center of output at dft_shift + 1 + up = Treal(up_fac) + shift = round.(Treal, shift .* up) ./ up # initial shift estimate + dft_shift = Treal(ceil(up_fac * 1.5) / 2) # center of output at dft_shift + 1 + denom = prod(ind2) * up ^ 2 CC_refine = dftups( - Array(img2_f .* conj.(img1_f)), + img2_f .* conj.(img1_f), ceil(Int, up_fac * 1.5), up_fac, - dft_shift .- shift .* up_fac, - ) / (prod(ind2) * up_fac ^ 2) + dft_shift .- shift .* up, + ) / denom - loc = argmax(abs.(CC_refine)) - locI = Tuple(loc) - CC_refine_max = CC_refine[loc] - locI = locI .- dft_shift .- 1 - shift = shift .+ locI ./ up_fac + _, loc = findmax(abs, CC_refine) + locI_ref = Treal.(Tuple(loc)) + CC_refine_max = _scalar_at(CC_refine, loc) + shift = shift .+ (locI_ref .- dft_shift .- one(Treal)) ./ up - img1_00 = dftups(Array(img1_f .* conj.(img1_f)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) - img2_00 = dftups(Array(img2_f .* conj.(img2_f)), 1, up_fac)[1] / (prod(ind2) * up_fac ^ 2) + img1_00 = _scalar_at(dftups(img1_f .* conj.(img1_f), 1, up_fac), 1) / denom + img2_00 = _scalar_at(dftups(img2_f .* conj.(img2_f), 1, up_fac), 1) / denom CC_max = CC_refine_max else img1_00 = sum(img1_f .* conj.(img1_f)) / prod(indi) @@ -120,34 +152,79 @@ function dftreg_subpix!( end error = 1 - CC_max * conj(CC_max) / (img1_00 * img2_00) - error = sqrt(abs(error)) - diffphase = atan(imag(CC_max), real(CC_max)) + error = sqrt(abs(error)) |> Treal + diffphase = Treal(atan(imag(CC_max), real(CC_max))) error, shift, diffphase end function subpix_shift!( + out::AbstractMatrix{<:Complex}, img_f::AbstractMatrix{<:Complex}, N::AbstractMatrix{<:Real}, shift, diffphase, ) + size(out) == size(img_f) || throw(DimensionMismatch("out must have the same size as img_f")) size(img_f) == size(N) || throw(DimensionMismatch("N must have the same size as img_f")) + length(shift) == ndims(img_f) || throw(DimensionMismatch("shift must match image dimensionality")) sz = [size(img_f)...] - T = float(real(eltype(img_f))) - N_ = zero(T) + Tphase = float(real(eltype(out))) + TN = eltype(N) + fill!(N, zero(TN)) for i in eachindex(sz) shifti = ifftshift((-div(sz[i], 2)):(ceil(Int, sz[i] / 2) - 1)) * shift[i] / sz[i] resh = (ntuple(_ -> 1, i - 1)..., length(shifti)) - N_ = N_ .- T.(reshape(shifti, resh)) + shifti_backend = _to_backend(N, reshape(TN.(shifti), resh)) + N .-= shifti_backend end - copyto!(N, N_) - phase = cis(T(diffphase)) - twopi_im = complex(zero(T), T(2 * pi)) - phase .* (img_f .* exp.(twopi_im .* N)) + phase = cis(Tphase(diffphase)) + twopi_im = complex(zero(Tphase), Tphase(2 * pi)) + @. out = phase * (img_f * exp(twopi_im * N)) + out +end + +function subpix_shift!( + img_f::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}, + shift, + diffphase, +) + out = similar(img_f) + subpix_shift!(out, img_f, N, shift, diffphase) +end + +function dftreg_resample!( + out::AbstractMatrix{<:Real}, + img_f::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}, + shift, + diffphase, + ; + work_f::AbstractMatrix{<:Complex}=similar(img_f), +) + size(out) == size(img_f) || throw(DimensionMismatch("out must have the same size as img_f")) + size(work_f) == size(img_f) || throw(DimensionMismatch("work_f must have the same size as img_f")) + + subpix_shift!(work_f, img_f, N, shift, diffphase) + _ifft!(work_f) + out .= real.(work_f) + out +end + +function dftreg_resample( + img_f::AbstractMatrix{<:Complex}, + N::AbstractMatrix{<:Real}, + shift, + diffphase, + ; + work_f::AbstractMatrix{<:Complex}=similar(img_f), +) + out = similar(N, float(real(eltype(img_f))), size(img_f)) + dftreg_resample!(out, img_f, N, shift, diffphase; work_f=work_f) end function dftreg_resample!( @@ -156,7 +233,7 @@ function dftreg_resample!( shift, diffphase, ) - real(_ifft(subpix_shift!(img_f, N, shift, diffphase))) + dftreg_resample(img_f, N, shift, diffphase) end function reg_stack_translate!( @@ -185,7 +262,7 @@ function reg_stack_translate!( error, shift, diffphase = reg_param[z] end - img_stack_reg[:, :, z] .= dftreg_resample!(img2_f, N, shift, diffphase) + dftreg_resample!(view(img_stack_reg, :, :, z), img2_f, N, shift, diffphase; work_f=img2_f) CC2x .= zero(eltype(CC2x)) N .= zero(eltype(N)) end From 08620b7a572064d2ca8438278e0b70a66da74df3 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:26:49 +0000 Subject: [PATCH 06/40] update doc --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 72bcca2..01521cc 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ img1_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) img2_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) CC_g = CuArray{Complex{Float32}}(undef, size_x, size_y) N_g = CuArray{Float32}(undef, size_x, size_y) +img2_reg_g = CuArray{Float32}(undef, size_x, size_y) # copy to GPU copyto!(img1_g, Float32.(img1)) @@ -34,8 +35,8 @@ img2_f_g .= fft(img2_g) # register (find the optimal translation) error, shift, diffphase = dftreg!(img1_f_g, img2_f_g, CC_g) -# resample the moving image -img2_reg_g = dftreg_resample!(img2_f_g, N_g, shift, diffphase) +# resample the moving image (in-place) +dftreg_resample!(img2_reg_g, img2_f_g, N_g, shift, diffphase) # copy to CPU Array(img2_reg_g) @@ -50,6 +51,7 @@ img1_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) img2_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) CC2x_g = CuArray{Complex{Float32}}(undef, 2 * size_x, 2 * size_y) N_g = CuArray{Float32}(undef, size_x, size_y) +img2_reg_g = CuArray{Float32}(undef, size_x, size_y) # copy to GPU copyto!(img1_g, Float32.(img1)) @@ -62,8 +64,8 @@ img2_f_g .= fft(img2_g) # register (find the optimal translation) error, shift, diffphase = dftreg_subpix!(img1_f_g, img2_f_g, CC2x_g) -# resample the moving image -img2_reg_g = dftreg_resample!(img2_f_g, N_g, shift, diffphase) +# resample the moving image (in-place) +dftreg_resample!(img2_reg_g, img2_f_g, N_g, shift, diffphase) # copy to CPU Array(img2_reg_g) From 095101f728de478da3701a71553389bccdbee38e Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:31:21 +0000 Subject: [PATCH 07/40] Add core unit tests and test target dependencies --- Project.toml | 8 +++++ test/runtests.jl | 5 ++++ test/unit_tests.jl | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 test/runtests.jl create mode 100644 test/unit_tests.jl diff --git a/Project.toml b/Project.toml index b0f5c40..c25e9fb 100644 --- a/Project.toml +++ b/Project.toml @@ -13,3 +13,11 @@ FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" [extensions] FFTRegGPUCUDAExt = "CUDA" FFTRegGPUCPUExt = "FFTW" + +[extras] +FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test", "FFTW", "Random"] diff --git a/test/runtests.jl b/test/runtests.jl new file mode 100644 index 0000000..afcc7f6 --- /dev/null +++ b/test/runtests.jl @@ -0,0 +1,5 @@ +using Test +using FFTW +using FFTRegGPU + +include("unit_tests.jl") diff --git a/test/unit_tests.jl b/test/unit_tests.jl new file mode 100644 index 0000000..8058b8d --- /dev/null +++ b/test/unit_tests.jl @@ -0,0 +1,75 @@ +using Random +using Test + +@testset "FFTRegGPU unit tests" begin + rng = MersenneTwister(42) + nx, ny = 32, 24 + + img = rand(rng, Float32, nx, ny) + img_f = fft(img) + + @testset "argument validation" begin + bad_cc = zeros(ComplexF32, nx + 1, ny) + @test_throws DimensionMismatch dftreg!(img_f, img_f, bad_cc) + + cc2x = zeros(ComplexF32, 2 * nx, 2 * ny) + @test_throws ArgumentError dftreg_subpix!(img_f, img_f, cc2x, 0) + + bad_cc2x = zeros(ComplexF32, 2 * nx + 1, 2 * ny) + @test_throws DimensionMismatch dftreg_subpix!(img_f, img_f, bad_cc2x, 10) + + @test_throws ArgumentError FFTRegGPU.dftups(img_f, 0, 1) + @test_throws ArgumentError FFTRegGPU.dftups(img_f, 4, 0) + + out_bad = zeros(Float32, nx + 1, ny) + nbuf = zeros(Float32, nx, ny) + @test_throws DimensionMismatch dftreg_resample!(out_bad, img_f, nbuf, (0f0, 0f0), 0f0) + end + + @testset "identity registration" begin + cc = similar(img_f) + err, shift, phase = dftreg!(img_f, img_f, cc) + + @test err ≤ 1f-5 + @test isapprox(phase, 0f0; atol=1f-5) + @test eltype(shift) == Float32 + @test all(isapprox.(shift, zero(eltype(shift)); atol=1f-5)) + end + + @testset "compatibility wrappers" begin + shifted = circshift(img, (3, -2)) + shifted_f = fft(shifted) + + cc1 = similar(img_f) + cc2 = similar(img_f) + err_ref, shift_ref, phase_ref = dftreg!(img_f, shifted_f, cc1) + err_wrap, shift_wrap, phase_wrap = dftreg_gpu!(img_f, shifted_f, cc2) + + @test isapprox(err_ref, err_wrap; atol=1f-6) + @test isapprox(phase_ref, phase_wrap; atol=1f-6) + @test all(isapprox.(shift_ref, shift_wrap; atol=1f-6)) + end + + @testset "resampling API" begin + shift = Float32[2.0, -1.0] + phase = 0f0 + nbuf1 = zeros(Float32, nx, ny) + nbuf2 = zeros(Float32, nx, ny) + + moved = circshift(img, (2, -1)) + moved_f = fft(moved) + + alloc_out = dftreg_resample(moved_f, nbuf1, shift, phase) + inpl_out = similar(img) + work_f = similar(moved_f) + ret = dftreg_resample!(inpl_out, moved_f, nbuf2, shift, phase; work_f=work_f) + + @test ret === inpl_out + @test alloc_out ≈ inpl_out atol = 1f-5 + + phase_shifted = similar(moved_f) + ret2 = subpix_shift!(phase_shifted, moved_f, nbuf2, (0f0, 0f0), 0f0) + @test ret2 === phase_shifted + @test phase_shifted ≈ moved_f atol = 1f-6 + end +end From 86b0cdd6bdf5d95799e7c575ee054afcb104c9f0 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:34:37 +0000 Subject: [PATCH 08/40] Add synthetic noisy stack registration tests --- test/runtests.jl | 1 + test/synthetic_stack_tests.jl | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 test/synthetic_stack_tests.jl diff --git a/test/runtests.jl b/test/runtests.jl index afcc7f6..88a5505 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -3,3 +3,4 @@ using FFTW using FFTRegGPU include("unit_tests.jl") +include("synthetic_stack_tests.jl") diff --git a/test/synthetic_stack_tests.jl b/test/synthetic_stack_tests.jl new file mode 100644 index 0000000..cccdd33 --- /dev/null +++ b/test/synthetic_stack_tests.jl @@ -0,0 +1,71 @@ +using Random +using Test + +function make_blob_image(nx::Int, ny::Int, rng::AbstractRNG; nspots::Int=10, sigma::Float32=2.8f0) + x = reshape(Float32.(0:(nx - 1)), nx, 1) + y = reshape(Float32.(0:(ny - 1)), 1, ny) + img = zeros(Float32, nx, ny) + + two_sigma2 = 2f0 * sigma^2 + for _ in 1:nspots + cx = rand(rng, Float32) * Float32(nx - 1) + cy = rand(rng, Float32) * Float32(ny - 1) + amp = 0.2f0 + 0.8f0 * rand(rng, Float32) + img .+= amp .* exp.(-((x .- cx).^2 .+ (y .- cy).^2) ./ two_sigma2) + end + + img ./= maximum(img) + img +end + +function stack_adjacent_mse(stack::AbstractArray{<:Real,3}) + _, _, nz = size(stack) + nz <= 1 && return 0.0 + acc = 0.0 + for z in 2:nz + a = @view stack[:, :, z - 1] + b = @view stack[:, :, z] + acc += sum((a .- b) .^ 2) / length(a) + end + acc / (nz - 1) +end + +@testset "synthetic noisy stack registration" begin + rng = MersenneTwister(20260313) + nx, ny = 64, 64 + known_rel = [(1, -1), (2, 1), (-1, 2), (0, -2), (1, 1)] + nz = length(known_rel) + 1 + + base = make_blob_image(nx, ny, rng) + clean_stack = zeros(Float32, nx, ny, nz) + clean_stack[:, :, 1] .= base + for z in 2:nz + clean_stack[:, :, z] .= circshift(@view(clean_stack[:, :, z - 1]), known_rel[z - 1]) + end + + noise_sigma = 0.03f0 + noisy_stack = clean_stack .+ noise_sigma .* randn(rng, Float32, nx, ny, nz) + reg_stack = copy(noisy_stack) + + img1_f = zeros(ComplexF32, nx, ny) + img2_f = zeros(ComplexF32, nx, ny) + cc2x = zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + + mse_before = stack_adjacent_mse(noisy_stack) + reg_stack_translate!(reg_stack, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) + mse_after = stack_adjacent_mse(reg_stack) + + @test length(reg_param) == nz - 1 + cum_shift = zeros(Float32, 2) + for z in 2:nz + cum_shift .+= Float32.(collect(known_rel[z - 1])) + _, shift, _ = reg_param[z] + expected = -cum_shift + @test length(shift) == 2 + @test all(isapprox.(shift, expected; atol=0.35f0)) + end + + @test mse_after < 0.75 * mse_before +end From d82b891b7fb5766cbd12748e47e233351f793406 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:36:59 +0000 Subject: [PATCH 09/40] Remove legacy wrapper symbols --- README.md | 2 +- src/FFTRegGPU.jl | 13 +------------ test/unit_tests.jl | 14 ++++---------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 01521cc..ab024fa 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ dftreg_resample!(img2_reg_g, img2_f_g, N_g, shift, diffphase) Array(img2_reg_g) ``` ### Registering a set of 2D images (subpixel registration) -Use the function `dftreg_subpix_gpu!`. For the argument `CC2x_g`, the array size should be 2x of the image size. +Use the function `dftreg_subpix!`. For the argument `CC2x_g`, the array size should be 2x of the image size. ```julia # allocate GPU memory img1_g = CuArray{Float32}(undef, size_x, size_y) diff --git a/src/FFTRegGPU.jl b/src/FFTRegGPU.jl index 6271da0..4215383 100644 --- a/src/FFTRegGPU.jl +++ b/src/FFTRegGPU.jl @@ -8,17 +8,6 @@ export dftreg!, subpix_shift!, dftreg_resample, dftreg_resample!, - reg_stack_translate!, - dftreg_gpu!, - dftreg_subpix_gpu!, - subpix_shift_gpu!, - dftreg_resample_gpu! - -# Backward-compatible wrappers around the backend-agnostic API. -dftreg_gpu!(args...) = dftreg!(args...) -dftreg_subpix_gpu!(args...) = dftreg_subpix!(args...) -subpix_shift_gpu!(args...) = subpix_shift!(args...) -dftreg_resample_gpu(args...; kwargs...) = dftreg_resample(args...; kwargs...) -dftreg_resample_gpu!(args...; kwargs...) = dftreg_resample!(args...; kwargs...) + reg_stack_translate! end # module diff --git a/test/unit_tests.jl b/test/unit_tests.jl index 8058b8d..f8e0b57 100644 --- a/test/unit_tests.jl +++ b/test/unit_tests.jl @@ -36,18 +36,12 @@ using Test @test all(isapprox.(shift, zero(eltype(shift)); atol=1f-5)) end - @testset "compatibility wrappers" begin + @testset "integer shift recovery" begin shifted = circshift(img, (3, -2)) shifted_f = fft(shifted) - - cc1 = similar(img_f) - cc2 = similar(img_f) - err_ref, shift_ref, phase_ref = dftreg!(img_f, shifted_f, cc1) - err_wrap, shift_wrap, phase_wrap = dftreg_gpu!(img_f, shifted_f, cc2) - - @test isapprox(err_ref, err_wrap; atol=1f-6) - @test isapprox(phase_ref, phase_wrap; atol=1f-6) - @test all(isapprox.(shift_ref, shift_wrap; atol=1f-6)) + cc = similar(img_f) + _, shift, _ = dftreg!(img_f, shifted_f, cc) + @test all(isapprox.(shift, Float32[-3, 2]; atol=1f-5)) end @testset "resampling API" begin From a4e94dc92ea2893d002dc67ecf2e2ef879d0da51 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:49:22 +0000 Subject: [PATCH 10/40] Add benchmarking suite --- benchmark/Project.toml | 7 + benchmark/README.md | 43 +++++ benchmark/run_benchmarks.jl | 366 ++++++++++++++++++++++++++++++++++++ 3 files changed, 416 insertions(+) create mode 100644 benchmark/Project.toml create mode 100644 benchmark/README.md create mode 100644 benchmark/run_benchmarks.jl diff --git a/benchmark/Project.toml b/benchmark/Project.toml new file mode 100644 index 0000000..bbedb82 --- /dev/null +++ b/benchmark/Project.toml @@ -0,0 +1,7 @@ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +FFTRegGPU = "86d2b4ce-0b7d-4e3e-98ec-23077478530b" + +[sources] +FFTRegGPU = {path = ".."} diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..44c1478 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,43 @@ +# Benchmarking FFTRegGPU + +This benchmark suite is deterministic (fixed synthetic data seed) and reusable across commits. + +## Setup + +```bash +julia --project=benchmark -e 'using Pkg; Pkg.instantiate()' +``` + +## Run + +From the repository root: + +```bash +julia --project=benchmark benchmark/run_benchmarks.jl --backend=cpu --samples=30 --output=benchmark/results/cpu.csv +``` + +To run CUDA too: + +```bash +julia --project=benchmark -e 'using Pkg; Pkg.add("CUDA")' +julia --project=benchmark benchmark/run_benchmarks.jl --backend=both --samples=20 --output=benchmark/results/both.csv +``` + +If CUDA is not functional on the machine, CUDA cases are skipped automatically. + +## Useful options + +- `--backend=cpu|cuda|both` +- `--samples=N` +- `--evals=N` +- `--seed=N` +- `--sizes=128x128,256x256` +- `--stack=256x256x64` +- `--noise=0.02` +- `--output=PATH` + +Use `--help` for all options: + +```bash +julia --project=benchmark benchmark/run_benchmarks.jl --help +``` diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl new file mode 100644 index 0000000..a275f33 --- /dev/null +++ b/benchmark/run_benchmarks.jl @@ -0,0 +1,366 @@ +using BenchmarkTools +using FFTRegGPU +using FFTW +using Random +using Printf + +const DEFAULT_SEED = 20260313 + +struct BenchConfig + backend::Symbol + samples::Int + evals::Int + seed::Int + sizes::Vector{Tuple{Int,Int}} + stack_size::NTuple{3,Int} + noise_sigma::Float32 + output::Union{Nothing,String} +end + +function parse_dim2(token::AbstractString) + m = match(r"^(\d+)x(\d+)$", lowercase(strip(token))) + m === nothing && error("Invalid 2D size '$token'. Use NxM (e.g. 256x256).") + parse(Int, m.captures[1]), parse(Int, m.captures[2]) +end + +function parse_dim3(token::AbstractString) + m = match(r"^(\d+)x(\d+)x(\d+)$", lowercase(strip(token))) + m === nothing && error("Invalid 3D size '$token'. Use NxMxZ (e.g. 256x256x64).") + parse(Int, m.captures[1]), parse(Int, m.captures[2]), parse(Int, m.captures[3]) +end + +function parse_sizes(token::AbstractString) + [parse_dim2(s) for s in split(token, ",")] +end + +function parse_backend(token::AbstractString) + b = Symbol(lowercase(strip(token))) + b in (:cpu, :cuda, :both) || error("backend must be cpu, cuda, or both") + b +end + +function parse_args(args::Vector{String}) + cfg = Dict( + :backend => :both, + :samples => 20, + :evals => 1, + :seed => DEFAULT_SEED, + :sizes => [(128, 128), (256, 256)], + :stack_size => (256, 256, 64), + :noise_sigma => 0.02f0, + :output => nothing, + ) + + for arg in args + if arg == "--help" || arg == "-h" + println(""" +Usage: + julia --project=benchmark benchmark/run_benchmarks.jl [options] + +Options: + --backend=cpu|cuda|both Benchmark backend(s). Default: both + --samples=N BenchmarkTools samples per case. Default: 20 + --evals=N BenchmarkTools evals per sample. Default: 1 + --seed=N RNG seed for synthetic data. Default: $(DEFAULT_SEED) + --sizes=128x128,256x256 2D pair benchmark sizes. Default: 128x128,256x256 + --stack=256x256x64 3D stack benchmark size. Default: 256x256x64 + --noise=0.02 Added Gaussian noise sigma. Default: 0.02 + --output=PATH Optional CSV output path. +""") + exit(0) + elseif startswith(arg, "--backend=") + cfg[:backend] = parse_backend(split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--samples=") + cfg[:samples] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--evals=") + cfg[:evals] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--seed=") + cfg[:seed] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--sizes=") + cfg[:sizes] = parse_sizes(split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--stack=") + cfg[:stack_size] = parse_dim3(split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--noise=") + cfg[:noise_sigma] = Float32(parse(Float64, split(arg, "=", limit=2)[2])) + elseif startswith(arg, "--output=") + cfg[:output] = split(arg, "=", limit=2)[2] + else + error("Unknown option: $arg") + end + end + + cfg[:samples] > 0 || error("samples must be positive") + cfg[:evals] > 0 || error("evals must be positive") + + BenchConfig( + cfg[:backend], + cfg[:samples], + cfg[:evals], + cfg[:seed], + cfg[:sizes], + cfg[:stack_size], + cfg[:noise_sigma], + cfg[:output], + ) +end + +function make_base_image(nx::Int, ny::Int, rng::AbstractRNG) + x = reshape(collect(LinRange(0f0, 1f0, nx)), nx, 1) + y = reshape(collect(LinRange(0f0, 1f0, ny)), 1, ny) + img = @. 0.55f0 * sin(2f0 * π * (3f0 * x + 5f0 * y)) + 0.35f0 * cos(2f0 * π * (7f0 * x - 2f0 * y)) + img .+= 0.10f0 .* randn(rng, Float32, nx, ny) + img .-= minimum(img) + img ./= maximum(img) + img +end + +function make_integer_pair(nx::Int, ny::Int, rng::AbstractRNG, noise_sigma::Float32) + img1 = make_base_image(nx, ny, rng) + img2 = circshift(img1, (3, -2)) + img2 .+= noise_sigma .* randn(rng, Float32, nx, ny) + fft(img1), fft(img2) +end + +function make_subpixel_pair(nx::Int, ny::Int, rng::AbstractRNG, noise_sigma::Float32) + img1 = make_base_image(nx, ny, rng) + img1_f = fft(img1) + + shift = Float32[2.25, -1.75] + nbuf = zeros(Float32, nx, ny) + shifted_f = similar(img1_f) + subpix_shift!(shifted_f, img1_f, nbuf, shift, 0f0) + img2 = real(ifft(shifted_f)) + img2 .+= noise_sigma .* randn(rng, Float32, nx, ny) + img1_f, fft(img2) +end + +function make_stack(nx::Int, ny::Int, nz::Int, rng::AbstractRNG, noise_sigma::Float32) + stack = zeros(Float32, nx, ny, nz) + stack[:, :, 1] .= make_base_image(nx, ny, rng) + + for z in 2:nz + stack[:, :, z] .= circshift(@view(stack[:, :, z - 1]), (1, -1)) + end + stack .+= noise_sigma .* randn(rng, Float32, nx, ny, nz) + stack +end + +function push_summary!(rows, backend::String, case_name::String, dims::String, cfg::BenchConfig, trial::BenchmarkTools.Trial) + med = BenchmarkTools.median(trial) + mn = BenchmarkTools.mean(trial) + mnm = BenchmarkTools.minimum(trial) + push!( + rows, + ( + backend = backend, + case = case_name, + dims = dims, + median_ms = med.time / 1e6, + mean_ms = mn.time / 1e6, + min_ms = mnm.time / 1e6, + memory_bytes = med.memory, + allocs = med.allocs, + samples = cfg.samples, + evals = cfg.evals, + ), + ) +end + +function run_cpu_benchmarks(cfg::BenchConfig, rows) + println("Running CPU benchmarks...") + + for (i, (nx, ny)) in enumerate(cfg.sizes) + rng = MersenneTwister(cfg.seed + i) + dims = "$(nx)x$(ny)" + + img1_f, img2_f = make_integer_pair(nx, ny, rng, cfg.noise_sigma) + cc = similar(img1_f) + dftreg!(img1_f, img2_f, cc) # warmup + trial = run(@benchmarkable dftreg!($img1_f, $img2_f, $cc) samples=cfg.samples evals=cfg.evals) + push_summary!(rows, "cpu", "dftreg", dims, cfg, trial) + + img1_f_sub, img2_f_sub = make_subpixel_pair(nx, ny, rng, cfg.noise_sigma) + cc2x = zeros(eltype(img1_f_sub), 2 * nx, 2 * ny) + dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x) # warmup + trial = run( + @benchmarkable dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x) samples=cfg.samples evals=cfg.evals + ) + push_summary!(rows, "cpu", "dftreg_subpix", dims, cfg, trial) + end + + nx, ny, nz = cfg.stack_size + rng = MersenneTwister(cfg.seed + 100) + dims = "$(nx)x$(ny)x$(nz)" + stack_template = make_stack(nx, ny, nz, rng, cfg.noise_sigma) + stack_work = similar(stack_template) + img1_f = zeros(ComplexF32, nx, ny) + img2_f = zeros(ComplexF32, nx, ny) + cc2x = zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + + copyto!(stack_work, stack_template) + reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup + + trial = run( + @benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) + end samples=cfg.samples evals=1 + ) + push_summary!(rows, "cpu", "reg_stack_translate", dims, cfg, trial) +end + +function maybe_load_cuda() + Base.find_package("CUDA") === nothing && return nothing + try + @eval using CUDA + CUDA.functional() || return nothing + CUDA + catch + nothing + end +end + +function run_cuda_benchmarks(cfg::BenchConfig, rows) + CUDA = maybe_load_cuda() + if CUDA === nothing + println("Skipping CUDA benchmarks (CUDA not installed or no functional CUDA device).") + return + end + println("Running CUDA benchmarks...") + + for (i, (nx, ny)) in enumerate(cfg.sizes) + rng = MersenneTwister(cfg.seed + i) + dims = "$(nx)x$(ny)" + + img1_f_cpu, img2_f_cpu = make_integer_pair(nx, ny, rng, cfg.noise_sigma) + img1_f = CUDA.CuArray(img1_f_cpu) + img2_f = CUDA.CuArray(img2_f_cpu) + cc = similar(img1_f) + + dftreg!(img1_f, img2_f, cc) # warmup + CUDA.synchronize() + trial = run( + @benchmarkable begin + dftreg!($img1_f, $img2_f, $cc) + CUDA.synchronize() + end samples=cfg.samples evals=cfg.evals + ) + push_summary!(rows, "cuda", "dftreg", dims, cfg, trial) + + img1_f_sub_cpu, img2_f_sub_cpu = make_subpixel_pair(nx, ny, rng, cfg.noise_sigma) + img1_f_sub = CUDA.CuArray(img1_f_sub_cpu) + img2_f_sub = CUDA.CuArray(img2_f_sub_cpu) + cc2x = CUDA.zeros(eltype(img1_f_sub), 2 * nx, 2 * ny) + + dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x) # warmup + CUDA.synchronize() + trial = run( + @benchmarkable begin + dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x) + CUDA.synchronize() + end samples=cfg.samples evals=cfg.evals + ) + push_summary!(rows, "cuda", "dftreg_subpix", dims, cfg, trial) + end + + nx, ny, nz = cfg.stack_size + rng = MersenneTwister(cfg.seed + 100) + dims = "$(nx)x$(ny)x$(nz)" + stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, cfg.noise_sigma)) + stack_work = similar(stack_template) + img1_f = CUDA.zeros(ComplexF32, nx, ny) + img2_f = CUDA.zeros(ComplexF32, nx, ny) + cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = CUDA.zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + + copyto!(stack_work, stack_template) + reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup + CUDA.synchronize() + + trial = run( + @benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) + CUDA.synchronize() + end samples=cfg.samples evals=1 + ) + push_summary!(rows, "cuda", "reg_stack_translate", dims, cfg, trial) +end + +function print_rows(rows) + println() + println("Benchmark results (times in ms):") + println(rpad("backend", 8), rpad("case", 20), rpad("dims", 14), lpad("median", 12), lpad("mean", 12), lpad("min", 12), lpad("memory", 12), lpad("allocs", 10)) + for r in rows + @printf( + "%-8s%-20s%-14s%12.3f%12.3f%12.3f%12d%10d\n", + r.backend, + r.case, + r.dims, + r.median_ms, + r.mean_ms, + r.min_ms, + r.memory_bytes, + r.allocs, + ) + end +end + +function write_csv(path::String, rows, cfg::BenchConfig) + mkpath(dirname(path)) + open(path, "w") do io + println(io, "backend,case,dims,median_ms,mean_ms,min_ms,memory_bytes,allocs,samples,evals,seed") + for r in rows + @printf( + io, + "%s,%s,%s,%.6f,%.6f,%.6f,%d,%d,%d,%d,%d\n", + r.backend, + r.case, + r.dims, + r.median_ms, + r.mean_ms, + r.min_ms, + r.memory_bytes, + r.allocs, + cfg.samples, + cfg.evals, + cfg.seed, + ) + end + end +end + +function main() + cfg = parse_args(ARGS) + rows = Vector{NamedTuple}() + + println("FFTRegGPU benchmark configuration:") + println(" backend: ", cfg.backend) + println(" samples: ", cfg.samples) + println(" evals: ", cfg.evals) + println(" seed: ", cfg.seed) + println(" sizes: ", join(["$(x)x$(y)" for (x, y) in cfg.sizes], ", ")) + println(" stack: ", "$(cfg.stack_size[1])x$(cfg.stack_size[2])x$(cfg.stack_size[3])") + println(" noise: ", cfg.noise_sigma) + + if cfg.backend in (:cpu, :both) + run_cpu_benchmarks(cfg, rows) + end + if cfg.backend in (:cuda, :both) + run_cuda_benchmarks(cfg, rows) + end + + print_rows(rows) + if cfg.output !== nothing + write_csv(cfg.output, rows, cfg) + println() + println("Wrote CSV: ", cfg.output) + end +end + +main() From 46bb91830a9fd6d78cceac2d1c20731a4b6cd31a Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 10:49:33 +0000 Subject: [PATCH 11/40] Ignore benchmark results in git --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 9dd64dd..e4c76d7 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ docs/site/ # environment. Manifest.toml +# Benchmark outputs +benchmark/results/ From f0c9fa85c39025e1b7cce79e672d1e069c035314 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 11:21:33 +0000 Subject: [PATCH 12/40] Resolve issue with maybe_load_cuda() --- benchmark/run_benchmarks.jl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl index a275f33..f60a2bf 100644 --- a/benchmark/run_benchmarks.jl +++ b/benchmark/run_benchmarks.jl @@ -216,8 +216,10 @@ function maybe_load_cuda() Base.find_package("CUDA") === nothing && return nothing try @eval using CUDA - CUDA.functional() || return nothing - CUDA + # `@eval using CUDA` inside a function can create a newer-world binding. + cuda = Base.invokelatest(() -> getfield(@__MODULE__, :CUDA)) + Base.invokelatest(cuda.functional) || return nothing + cuda catch nothing end From e0e794e75150862f5aa110737edf4ab0e84313e4 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 11:26:01 +0000 Subject: [PATCH 13/40] Fix CUDA benchmark world-age errors after dynamic CUDA loading --- benchmark/run_benchmarks.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl index f60a2bf..cfe7bfa 100644 --- a/benchmark/run_benchmarks.jl +++ b/benchmark/run_benchmarks.jl @@ -232,7 +232,10 @@ function run_cuda_benchmarks(cfg::BenchConfig, rows) return end println("Running CUDA benchmarks...") + Base.invokelatest(_run_cuda_benchmarks_loaded, CUDA, cfg, rows) +end +function _run_cuda_benchmarks_loaded(CUDA, cfg::BenchConfig, rows) for (i, (nx, ny)) in enumerate(cfg.sizes) rng = MersenneTwister(cfg.seed + i) dims = "$(nx)x$(ny)" From 34af435063c5d7369e136e32c44bd3494d9c569e Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 11:30:29 +0000 Subject: [PATCH 14/40] Fix CuArray complex peak search in registration (avoid findmax(abs, ...)) --- src/dftreg_translate.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index ad0124d..e942789 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -57,7 +57,7 @@ function dftreg!( @. CC = img1_f * conj(img2_f) _ifft!(CC) - _, loc = findmax(abs, CC) + _, loc = findmax(abs2.(CC)) CCmax = _scalar_at(CC, loc) rfzero = sum(abs2, img1_f) / L rgzero = sum(abs2, img2_f) / L @@ -105,7 +105,7 @@ function dftreg_subpix!( # compute cross-correlation and locate the peak copyto!(CC2x, _ifftshift(CC2x)) _ifft!(CC2x) - _, loc = findmax(abs, CC2x) + _, loc = findmax(abs2.(CC2x)) indi = size(CC2x) locI = collect(Tuple(loc)) @@ -137,7 +137,7 @@ function dftreg_subpix!( dft_shift .- shift .* up, ) / denom - _, loc = findmax(abs, CC_refine) + _, loc = findmax(abs2.(CC_refine)) locI_ref = Treal.(Tuple(loc)) CC_refine_max = _scalar_at(CC_refine, loc) shift = shift .+ (locI_ref .- dft_shift .- one(Treal)) ./ up From 3726e9f3b1e70a6b7443b6dffa5f36ff5d746d40 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 11:46:02 +0000 Subject: [PATCH 15/40] Improve performance by using a scratch buffer for findmax(abs2.(...)) --- benchmark/run_benchmarks.jl | 22 ++++++++++++++-------- src/dftreg_translate.jl | 25 +++++++++++++++++++++---- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl index cfe7bfa..478ab27 100644 --- a/benchmark/run_benchmarks.jl +++ b/benchmark/run_benchmarks.jl @@ -175,15 +175,19 @@ function run_cpu_benchmarks(cfg::BenchConfig, rows) img1_f, img2_f = make_integer_pair(nx, ny, rng, cfg.noise_sigma) cc = similar(img1_f) - dftreg!(img1_f, img2_f, cc) # warmup - trial = run(@benchmarkable dftreg!($img1_f, $img2_f, $cc) samples=cfg.samples evals=cfg.evals) + cc_abs2_work = similar(cc, float(real(eltype(cc)))) + dftreg!(img1_f, img2_f, cc; cc_abs2_work=cc_abs2_work) # warmup + trial = run( + @benchmarkable dftreg!($img1_f, $img2_f, $cc; cc_abs2_work=$cc_abs2_work) samples=cfg.samples evals=cfg.evals + ) push_summary!(rows, "cpu", "dftreg", dims, cfg, trial) img1_f_sub, img2_f_sub = make_subpixel_pair(nx, ny, rng, cfg.noise_sigma) cc2x = zeros(eltype(img1_f_sub), 2 * nx, 2 * ny) - dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x) # warmup + cc2x_abs2_work = similar(cc2x, float(real(eltype(cc2x)))) + dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x; cc2x_abs2_work=cc2x_abs2_work) # warmup trial = run( - @benchmarkable dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x) samples=cfg.samples evals=cfg.evals + @benchmarkable dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x; cc2x_abs2_work=$cc2x_abs2_work) samples=cfg.samples evals=cfg.evals ) push_summary!(rows, "cpu", "dftreg_subpix", dims, cfg, trial) end @@ -244,12 +248,13 @@ function _run_cuda_benchmarks_loaded(CUDA, cfg::BenchConfig, rows) img1_f = CUDA.CuArray(img1_f_cpu) img2_f = CUDA.CuArray(img2_f_cpu) cc = similar(img1_f) + cc_abs2_work = similar(cc, float(real(eltype(cc)))) - dftreg!(img1_f, img2_f, cc) # warmup + dftreg!(img1_f, img2_f, cc; cc_abs2_work=cc_abs2_work) # warmup CUDA.synchronize() trial = run( @benchmarkable begin - dftreg!($img1_f, $img2_f, $cc) + dftreg!($img1_f, $img2_f, $cc; cc_abs2_work=$cc_abs2_work) CUDA.synchronize() end samples=cfg.samples evals=cfg.evals ) @@ -259,12 +264,13 @@ function _run_cuda_benchmarks_loaded(CUDA, cfg::BenchConfig, rows) img1_f_sub = CUDA.CuArray(img1_f_sub_cpu) img2_f_sub = CUDA.CuArray(img2_f_sub_cpu) cc2x = CUDA.zeros(eltype(img1_f_sub), 2 * nx, 2 * ny) + cc2x_abs2_work = similar(cc2x, float(real(eltype(cc2x)))) - dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x) # warmup + dftreg_subpix!(img1_f_sub, img2_f_sub, cc2x; cc2x_abs2_work=cc2x_abs2_work) # warmup CUDA.synchronize() trial = run( @benchmarkable begin - dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x) + dftreg_subpix!($img1_f_sub, $img2_f_sub, $cc2x; cc2x_abs2_work=$cc2x_abs2_work) CUDA.synchronize() end samples=cfg.samples evals=cfg.evals ) diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index e942789..fa3b423 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -17,6 +17,18 @@ function _to_backend(ref::AbstractArray, src::AbstractArray) out end +function _findmax_abs2_loc(inp::AbstractArray{<:Complex}, work::Union{Nothing,AbstractArray{<:Real}}=nothing) + if work === nothing + _, loc = findmax(abs2.(inp)) + return loc + end + + size(work) == size(inp) || throw(DimensionMismatch("work must have the same size as input")) + @. work = abs2(inp) + _, loc = findmax(work) + loc +end + function dftups(inp::AbstractArray{T,N}, no::Integer, usfac::Int=1, offset=nothing) where {T<:Number,N} no > 0 || throw(ArgumentError("no must be positive")) usfac > 0 || throw(ArgumentError("usfac must be positive")) @@ -47,6 +59,8 @@ function dftreg!( img1_f::AbstractMatrix{T1}, img2_f::AbstractMatrix{T2}, CC::AbstractMatrix{TC}, + ; + cc_abs2_work::Union{Nothing,AbstractMatrix{<:Real}}=nothing, ) where {T1<:Complex,T2<:Complex,TC<:Complex} size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) size(img1_f) == size(CC) || throw(DimensionMismatch("CC must have the same size as img1_f")) @@ -57,7 +71,7 @@ function dftreg!( @. CC = img1_f * conj(img2_f) _ifft!(CC) - _, loc = findmax(abs2.(CC)) + loc = _findmax_abs2_loc(CC, cc_abs2_work) CCmax = _scalar_at(CC, loc) rfzero = sum(abs2, img1_f) / L rgzero = sum(abs2, img2_f) / L @@ -85,6 +99,8 @@ function dftreg_subpix!( img2_f::AbstractMatrix{T2}, CC2x::AbstractMatrix{TC}, up_fac::Int=10, + ; + cc2x_abs2_work::Union{Nothing,AbstractMatrix{<:Real}}=nothing, ) where {T1<:Complex,T2<:Complex,TC<:Complex} size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) up_fac > 0 || throw(ArgumentError("up_fac must be positive")) @@ -105,7 +121,7 @@ function dftreg_subpix!( # compute cross-correlation and locate the peak copyto!(CC2x, _ifftshift(CC2x)) _ifft!(CC2x) - _, loc = findmax(abs2.(CC2x)) + loc = _findmax_abs2_loc(CC2x, cc2x_abs2_work) indi = size(CC2x) locI = collect(Tuple(loc)) @@ -137,7 +153,7 @@ function dftreg_subpix!( dft_shift .- shift .* up, ) / denom - _, loc = findmax(abs2.(CC_refine)) + loc = _findmax_abs2_loc(CC_refine) locI_ref = Treal.(Tuple(loc)) CC_refine_max = _scalar_at(CC_refine, loc) shift = shift .+ (locI_ref .- dft_shift .- one(Treal)) ./ up @@ -247,6 +263,7 @@ function reg_stack_translate!( _, _, size_z = size(img_stack_reg) CC2x .= zero(eltype(CC2x)) N .= zero(eltype(N)) + cc2x_abs2_work = similar(CC2x, float(real(eltype(CC2x)))) for z = 2:size_z z1, z2 = z - 1, z @@ -256,7 +273,7 @@ function reg_stack_translate!( img2_f .= _fft(img2) if !haskey(reg_param, z) - error, shift, diffphase = dftreg_subpix!(img1_f, img2_f, CC2x) + error, shift, diffphase = dftreg_subpix!(img1_f, img2_f, CC2x; cc2x_abs2_work=cc2x_abs2_work) reg_param[z] = (error, shift, diffphase) else error, shift, diffphase = reg_param[z] From 0c2162f40d1e04ff60df4b0aadbdb5e6abc44756 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 11:55:19 +0000 Subject: [PATCH 16/40] Allow running multiple stack sizes for benchmark --- benchmark/run_benchmarks.jl | 108 +++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 50 deletions(-) diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl index 478ab27..146a624 100644 --- a/benchmark/run_benchmarks.jl +++ b/benchmark/run_benchmarks.jl @@ -12,7 +12,7 @@ struct BenchConfig evals::Int seed::Int sizes::Vector{Tuple{Int,Int}} - stack_size::NTuple{3,Int} + stack_sizes::Vector{NTuple{3,Int}} noise_sigma::Float32 output::Union{Nothing,String} end @@ -33,6 +33,10 @@ function parse_sizes(token::AbstractString) [parse_dim2(s) for s in split(token, ",")] end +function parse_stack_sizes(token::AbstractString) + [parse_dim3(s) for s in split(token, ",")] +end + function parse_backend(token::AbstractString) b = Symbol(lowercase(strip(token))) b in (:cpu, :cuda, :both) || error("backend must be cpu, cuda, or both") @@ -46,7 +50,7 @@ function parse_args(args::Vector{String}) :evals => 1, :seed => DEFAULT_SEED, :sizes => [(128, 128), (256, 256)], - :stack_size => (256, 256, 64), + :stack_sizes => [(256, 256, 64)], :noise_sigma => 0.02f0, :output => nothing, ) @@ -63,7 +67,8 @@ Options: --evals=N BenchmarkTools evals per sample. Default: 1 --seed=N RNG seed for synthetic data. Default: $(DEFAULT_SEED) --sizes=128x128,256x256 2D pair benchmark sizes. Default: 128x128,256x256 - --stack=256x256x64 3D stack benchmark size. Default: 256x256x64 + --stack=256x256x64,256x256x96 + 3D stack benchmark sizes. Default: 256x256x64 --noise=0.02 Added Gaussian noise sigma. Default: 0.02 --output=PATH Optional CSV output path. """) @@ -79,7 +84,7 @@ Options: elseif startswith(arg, "--sizes=") cfg[:sizes] = parse_sizes(split(arg, "=", limit=2)[2]) elseif startswith(arg, "--stack=") - cfg[:stack_size] = parse_dim3(split(arg, "=", limit=2)[2]) + cfg[:stack_sizes] = parse_stack_sizes(split(arg, "=", limit=2)[2]) elseif startswith(arg, "--noise=") cfg[:noise_sigma] = Float32(parse(Float64, split(arg, "=", limit=2)[2])) elseif startswith(arg, "--output=") @@ -91,6 +96,7 @@ Options: cfg[:samples] > 0 || error("samples must be positive") cfg[:evals] > 0 || error("evals must be positive") + isempty(cfg[:stack_sizes]) && error("stack must include at least one size") BenchConfig( cfg[:backend], @@ -98,7 +104,7 @@ Options: cfg[:evals], cfg[:seed], cfg[:sizes], - cfg[:stack_size], + cfg[:stack_sizes], cfg[:noise_sigma], cfg[:output], ) @@ -192,28 +198,29 @@ function run_cpu_benchmarks(cfg::BenchConfig, rows) push_summary!(rows, "cpu", "dftreg_subpix", dims, cfg, trial) end - nx, ny, nz = cfg.stack_size - rng = MersenneTwister(cfg.seed + 100) - dims = "$(nx)x$(ny)x$(nz)" - stack_template = make_stack(nx, ny, nz, rng, cfg.noise_sigma) - stack_work = similar(stack_template) - img1_f = zeros(ComplexF32, nx, ny) - img2_f = zeros(ComplexF32, nx, ny) - cc2x = zeros(ComplexF32, 2 * nx, 2 * ny) - nbuf = zeros(Float32, nx, ny) - reg_param = Dict{Int,Any}() + for (i, (nx, ny, nz)) in enumerate(cfg.stack_sizes) + rng = MersenneTwister(cfg.seed + 100 + i) + dims = "$(nx)x$(ny)x$(nz)" + stack_template = make_stack(nx, ny, nz, rng, cfg.noise_sigma) + stack_work = similar(stack_template) + img1_f = zeros(ComplexF32, nx, ny) + img2_f = zeros(ComplexF32, nx, ny) + cc2x = zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() - copyto!(stack_work, stack_template) - reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup + copyto!(stack_work, stack_template) + reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup - trial = run( - @benchmarkable begin - copyto!($stack_work, $stack_template) - empty!($reg_param) - reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) - end samples=cfg.samples evals=1 - ) - push_summary!(rows, "cpu", "reg_stack_translate", dims, cfg, trial) + trial = run( + @benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) + end samples=cfg.samples evals=1 + ) + push_summary!(rows, "cpu", "reg_stack_translate", dims, cfg, trial) + end end function maybe_load_cuda() @@ -277,30 +284,31 @@ function _run_cuda_benchmarks_loaded(CUDA, cfg::BenchConfig, rows) push_summary!(rows, "cuda", "dftreg_subpix", dims, cfg, trial) end - nx, ny, nz = cfg.stack_size - rng = MersenneTwister(cfg.seed + 100) - dims = "$(nx)x$(ny)x$(nz)" - stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, cfg.noise_sigma)) - stack_work = similar(stack_template) - img1_f = CUDA.zeros(ComplexF32, nx, ny) - img2_f = CUDA.zeros(ComplexF32, nx, ny) - cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) - nbuf = CUDA.zeros(Float32, nx, ny) - reg_param = Dict{Int,Any}() - - copyto!(stack_work, stack_template) - reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup - CUDA.synchronize() - - trial = run( - @benchmarkable begin - copyto!($stack_work, $stack_template) - empty!($reg_param) - reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) - CUDA.synchronize() - end samples=cfg.samples evals=1 - ) - push_summary!(rows, "cuda", "reg_stack_translate", dims, cfg, trial) + for (i, (nx, ny, nz)) in enumerate(cfg.stack_sizes) + rng = MersenneTwister(cfg.seed + 100 + i) + dims = "$(nx)x$(ny)x$(nz)" + stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, cfg.noise_sigma)) + stack_work = similar(stack_template) + img1_f = CUDA.zeros(ComplexF32, nx, ny) + img2_f = CUDA.zeros(ComplexF32, nx, ny) + cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = CUDA.zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + + copyto!(stack_work, stack_template) + reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) # warmup + CUDA.synchronize() + + trial = run( + @benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf; reg_param=$reg_param) + CUDA.synchronize() + end samples=cfg.samples evals=1 + ) + push_summary!(rows, "cuda", "reg_stack_translate", dims, cfg, trial) + end end function print_rows(rows) @@ -356,7 +364,7 @@ function main() println(" evals: ", cfg.evals) println(" seed: ", cfg.seed) println(" sizes: ", join(["$(x)x$(y)" for (x, y) in cfg.sizes], ", ")) - println(" stack: ", "$(cfg.stack_size[1])x$(cfg.stack_size[2])x$(cfg.stack_size[3])") + println(" stack: ", join(["$(x)x$(y)x$(z)" for (x, y, z) in cfg.stack_sizes], ", ")) println(" noise: ", cfg.noise_sigma) if cfg.backend in (:cpu, :both) From c68b1251c9f676b3fcad7ddf9af8283325c2934e Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 13:14:36 +0000 Subject: [PATCH 17/40] Add script to compare performance across commits --- benchmark/README.md | 26 ++ .../compare_reg_stack_translate_commits.jl | 336 ++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 benchmark/compare_reg_stack_translate_commits.jl diff --git a/benchmark/README.md b/benchmark/README.md index 44c1478..e2f336c 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -25,6 +25,30 @@ julia --project=benchmark benchmark/run_benchmarks.jl --backend=both --samples=2 If CUDA is not functional on the machine, CUDA cases are skipped automatically. +## Compare `reg_stack_translate!` across two commits + +Run this standalone commit comparison benchmark (CUDA only): + +```bash +julia --project=benchmark benchmark/compare_reg_stack_translate_commits.jl \ + --current-ref=HEAD \ + --previous-ref=HEAD~1 \ + --stack=256x256x64,256x256x256 \ + --samples=20 +``` + +You can manually provide any two refs (branches, tags, or SHAs): + +```bash +julia --project=benchmark benchmark/compare_reg_stack_translate_commits.jl \ + --current-ref=3a1b2c4 \ + --previous-ref=f09d8e7 +``` + +The script prints: +- Median timing comparison (`current_ms`, `prev_ms`, ratio, percent delta) +- Output equivalence (`isapprox` + max absolute difference) per stack size + ## Useful options - `--backend=cpu|cuda|both` @@ -35,6 +59,8 @@ If CUDA is not functional on the machine, CUDA cases are skipped automatically. - `--stack=256x256x64` - `--noise=0.02` - `--output=PATH` +- `--current-ref=REF` +- `--previous-ref=REF` Use `--help` for all options: diff --git a/benchmark/compare_reg_stack_translate_commits.jl b/benchmark/compare_reg_stack_translate_commits.jl new file mode 100644 index 0000000..6b3a6c4 --- /dev/null +++ b/benchmark/compare_reg_stack_translate_commits.jl @@ -0,0 +1,336 @@ +using Printf +using Serialization + +const DEFAULT_SEED = 20260313 + +struct CompareConfig + repo_path::String + current_ref::String + previous_ref::String + stack_sizes::Vector{NTuple{3,Int}} + samples::Int + evals::Int + seed::Int + noise_sigma::Float32 +end + +function parse_dim3(token::AbstractString) + m = match(r"^(\d+)x(\d+)x(\d+)$", lowercase(strip(token))) + m === nothing && error("Invalid 3D size '$token'. Use NxMxZ (e.g. 256x256x64).") + parse(Int, m.captures[1]), parse(Int, m.captures[2]), parse(Int, m.captures[3]) +end + +function parse_stack_sizes(token::AbstractString) + [parse_dim3(s) for s in split(token, ",")] +end + +function parse_args(args::Vector{String}) + cfg = Dict( + :repo_path => abspath(joinpath(@__DIR__, "..")), + :current_ref => "HEAD", + :previous_ref => "HEAD~1", + :stack_sizes => [(256, 256, 64), (256, 256, 256)], + :samples => 20, + :evals => 1, + :seed => DEFAULT_SEED, + :noise_sigma => 0.02f0, + ) + + for arg in args + if arg == "--help" || arg == "-h" + println(""" +Usage: + julia --project=benchmark benchmark/compare_reg_stack_translate_commits.jl [options] + +Options: + --repo=PATH Path to FFTRegGPU repository. Default: repo root + --current-ref=REF Current/reference A git ref. Default: HEAD + --previous-ref=REF Baseline/reference B git ref. Default: HEAD~1 + --stack=256x256x64,256x256x256 Stack sizes to benchmark. Default: 256x256x64,256x256x256 + --samples=N BenchmarkTools samples per case. Default: 20 + --evals=N BenchmarkTools evals per sample. Default: 1 + --seed=N RNG seed for synthetic data. Default: $(DEFAULT_SEED) + --noise=0.02 Added Gaussian noise sigma. Default: 0.02 +""") + exit(0) + elseif startswith(arg, "--repo=") + cfg[:repo_path] = abspath(split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--current-ref=") + cfg[:current_ref] = split(arg, "=", limit=2)[2] + elseif startswith(arg, "--previous-ref=") + cfg[:previous_ref] = split(arg, "=", limit=2)[2] + elseif startswith(arg, "--stack=") + cfg[:stack_sizes] = parse_stack_sizes(split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--samples=") + cfg[:samples] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--evals=") + cfg[:evals] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--seed=") + cfg[:seed] = parse(Int, split(arg, "=", limit=2)[2]) + elseif startswith(arg, "--noise=") + cfg[:noise_sigma] = Float32(parse(Float64, split(arg, "=", limit=2)[2])) + else + error("Unknown option: $arg") + end + end + + isdir(cfg[:repo_path]) || error("Repo path does not exist: $(cfg[:repo_path])") + cfg[:samples] > 0 || error("samples must be positive") + cfg[:evals] > 0 || error("evals must be positive") + isempty(cfg[:current_ref]) && error("current-ref must not be empty") + isempty(cfg[:previous_ref]) && error("previous-ref must not be empty") + isempty(cfg[:stack_sizes]) && error("stack must include at least one size") + + CompareConfig( + cfg[:repo_path], + cfg[:current_ref], + cfg[:previous_ref], + cfg[:stack_sizes], + cfg[:samples], + cfg[:evals], + cfg[:seed], + cfg[:noise_sigma], + ) +end + +const CHILD_CODE = raw""" +using Pkg +using Random +using Serialization + +repo_checkout = ARGS[1] +result_file = ARGS[2] +stack_arg = ARGS[3] +samples = parse(Int, ARGS[4]) +evals = parse(Int, ARGS[5]) +seed = parse(Int, ARGS[6]) +noise_sigma = Float32(parse(Float64, ARGS[7])) + +function parse_stack_sizes(token::AbstractString) + out = NTuple{3,Int}[] + for s in split(token, ';') + isempty(s) && continue + p = split(s, 'x') + length(p) == 3 || error("Invalid stack size: $s (expected NxMxZ)") + push!(out, (parse(Int, p[1]), parse(Int, p[2]), parse(Int, p[3]))) + end + out +end + +stack_sizes = parse_stack_sizes(stack_arg) +isempty(stack_sizes) && error("No stack sizes provided") + +env_dir = mktempdir() +Pkg.activate(env_dir) +Pkg.develop(PackageSpec(path=repo_checkout)) +Pkg.instantiate() +Pkg.add(["BenchmarkTools", "FFTW", "CUDA"]) + +using BenchmarkTools +using FFTRegGPU +using FFTW +using CUDA + +CUDA.functional() || error("CUDA is not functional on this machine") + +function make_base_image(nx::Int, ny::Int, rng::AbstractRNG) + x = reshape(collect(LinRange(0f0, 1f0, nx)), nx, 1) + y = reshape(collect(LinRange(0f0, 1f0, ny)), 1, ny) + img = @. 0.55f0 * sin(2f0 * π * (3f0 * x + 5f0 * y)) + 0.35f0 * cos(2f0 * π * (7f0 * x - 2f0 * y)) + img .+= 0.10f0 .* randn(rng, Float32, nx, ny) + img .-= minimum(img) + img ./= maximum(img) + img +end + +function make_stack(nx::Int, ny::Int, nz::Int, rng::AbstractRNG, noise_sigma::Float32) + stack = zeros(Float32, nx, ny, nz) + stack[:, :, 1] .= make_base_image(nx, ny, rng) + for z in 2:nz + stack[:, :, z] .= circshift(@view(stack[:, :, z - 1]), (1, -1)) + end + stack .+= noise_sigma .* randn(rng, Float32, nx, ny, nz) + stack +end + +function _resolve_reg_fn() + if isdefined(FFTRegGPU, :reg_stack_translate_gpu!) + return getfield(FFTRegGPU, :reg_stack_translate_gpu!) + elseif isdefined(FFTRegGPU, :reg_stack_translate!) + return getfield(FFTRegGPU, :reg_stack_translate!) + else + error("Neither reg_stack_translate_gpu! nor reg_stack_translate! exists in this commit") + end +end + +function call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_param) + f = _resolve_reg_fn() + try + return f(stack_work, img1_f, img2_f, cc2x, nbuf; reg_param=reg_param) + catch err + if err isa MethodError + return f(stack_work, img1_f, img2_f, cc2x, nbuf) + end + rethrow(err) + end +end + +rows = NamedTuple[] +for (i, (nx, ny, nz)) in enumerate(stack_sizes) + rng = MersenneTwister(seed + 100 + i) + dims = "$(nx)x$(ny)x$(nz)" + + stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, noise_sigma)) + stack_work = similar(stack_template) + img1_f = CUDA.zeros(ComplexF32, nx, ny) + img2_f = CUDA.zeros(ComplexF32, nx, ny) + cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = CUDA.zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + + copyto!(stack_work, stack_template) + call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_param) + CUDA.synchronize() + stack_out = Array(stack_work) + + trial = run(@benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + call_reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf, $reg_param) + CUDA.synchronize() + end samples=samples evals=evals) + + med = BenchmarkTools.median(trial) + mn = BenchmarkTools.mean(trial) + mnm = BenchmarkTools.minimum(trial) + push!(rows, ( + dims = dims, + median_ms = med.time / 1e6, + mean_ms = mn.time / 1e6, + min_ms = mnm.time / 1e6, + memory_bytes = med.memory, + allocs = med.allocs, + stack_out = stack_out, + )) +end + +serialize(result_file, rows) +""" + +function write_child_script() + dir = mktempdir() + path = joinpath(dir, "bench_compare_one_ref.jl") + write(path, CHILD_CODE) + path +end + +function checkout_ref(repo_path::AbstractString, ref::AbstractString) + dir = mktempdir() + run(`git clone --quiet $(String(repo_path)) $dir`) + run(`git -C $dir checkout --quiet $(String(ref))`) + dir +end + +function run_ref( + repo_path::AbstractString, + ref::AbstractString, + child_file::AbstractString, + stack_sizes::Vector{NTuple{3,Int}}, + samples::Int, + evals::Int, + seed::Int, + noise_sigma::Float32, +) + checkout = checkout_ref(repo_path, ref) + result_dir = mktempdir() + result_file = joinpath(result_dir, "result.bin") + stack_arg = join(["$(x)x$(y)x$(z)" for (x, y, z) in stack_sizes], ";") + + cmd = `$(Base.julia_cmd()) $(String(child_file)) $checkout $result_file $stack_arg $samples $evals $seed $noise_sigma` + + try + run(cmd) + commit = chomp(read(`git -C $checkout rev-parse --short HEAD`, String)) + rows = deserialize(result_file) + return (commit=commit, rows=rows) + finally + rm(result_dir; force=true, recursive=true) + rm(checkout; force=true, recursive=true) + end +end + +function print_table(curr, prev, current_ref::String, previous_ref::String) + curr_by_dims = Dict(r.dims => r for r in curr.rows) + prev_by_dims = Dict(r.dims => r for r in prev.rows) + dims_all = sort!(collect(intersect(keys(curr_by_dims), keys(prev_by_dims)))) + isempty(dims_all) && error("No overlapping stack dimensions between compared refs.") + + println("CUDA reg_stack_translate! comparison") + println("current: $(curr.commit) ($current_ref)") + println("previous: $(prev.commit) ($previous_ref)") + println() + + @printf("%-14s%14s%14s%12s%12s\n", "dims", "current_ms", "prev_ms", "curr/prev", "delta_%") + for d in dims_all + c = curr_by_dims[d] + p = prev_by_dims[d] + ratio = c.median_ms / p.median_ms + delta = (c.median_ms - p.median_ms) / p.median_ms * 100 + @printf("%-14s%14.3f%14.3f%12.3f%12.1f\n", d, c.median_ms, p.median_ms, ratio, delta) + end + + println() + println("Output equivalence (isapprox):") + @printf("%-14s%8s%12s\n", "dims", "same", "max_abs") + for d in dims_all + a = curr_by_dims[d].stack_out + b = prev_by_dims[d].stack_out + max_abs = maximum(abs.(a .- b)) + same = isapprox(a, b; rtol=1f-4, atol=1f-4) + @printf("%-14s%8s%12.3e\n", d, same ? "yes" : "no", max_abs) + end +end + +function main() + cfg = parse_args(ARGS) + + println("Commit comparison configuration:") + println(" repo: ", cfg.repo_path) + println(" current-ref: ", cfg.current_ref) + println(" previous-ref: ", cfg.previous_ref) + println(" samples: ", cfg.samples) + println(" evals: ", cfg.evals) + println(" seed: ", cfg.seed) + println(" stack: ", join(["$(x)x$(y)x$(z)" for (x, y, z) in cfg.stack_sizes], ", ")) + println(" noise: ", cfg.noise_sigma) + println() + + child_file = write_child_script() + try + curr = run_ref( + cfg.repo_path, + cfg.current_ref, + child_file, + cfg.stack_sizes, + cfg.samples, + cfg.evals, + cfg.seed, + cfg.noise_sigma, + ) + prev = run_ref( + cfg.repo_path, + cfg.previous_ref, + child_file, + cfg.stack_sizes, + cfg.samples, + cfg.evals, + cfg.seed, + cfg.noise_sigma, + ) + print_table(curr, prev, cfg.current_ref, cfg.previous_ref) + finally + rm(dirname(child_file); force=true, recursive=true) + end +end + +main() From 944582076e34d1b5e001d8cffe67c82b7ff41b9f Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 13:27:50 +0000 Subject: [PATCH 18/40] Report GPU info when running commit compare bench --- .../compare_reg_stack_translate_commits.jl | 70 ++++++++++++++++++- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/benchmark/compare_reg_stack_translate_commits.jl b/benchmark/compare_reg_stack_translate_commits.jl index 6b3a6c4..19865ee 100644 --- a/benchmark/compare_reg_stack_translate_commits.jl +++ b/benchmark/compare_reg_stack_translate_commits.jl @@ -133,6 +133,23 @@ using CUDA CUDA.functional() || error("CUDA is not functional on this machine") +_safe_str(f, default="unknown") = try + string(f()) +catch + default +end + +function _cuda_info() + dev = CUDA.device() + ( + functional = true, + device_name = _safe_str(() -> CUDA.name(dev), string(dev)), + device_index = _safe_str(() -> CUDA.deviceid(dev)), + driver_version = _safe_str(CUDA.driver_version), + runtime_version = _safe_str(CUDA.runtime_version), + ) +end + function make_base_image(nx::Int, ny::Int, rng::AbstractRNG) x = reshape(collect(LinRange(0f0, 1f0, nx)), nx, 1) y = reshape(collect(LinRange(0f0, 1f0, ny)), 1, ny) @@ -176,6 +193,7 @@ function call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_p end rows = NamedTuple[] +all_buffers_on_cuda = true for (i, (nx, ny, nz)) in enumerate(stack_sizes) rng = MersenneTwister(seed + 100 + i) dims = "$(nx)x$(ny)x$(nz)" @@ -187,6 +205,14 @@ for (i, (nx, ny, nz)) in enumerate(stack_sizes) cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) nbuf = CUDA.zeros(Float32, nx, ny) reg_param = Dict{Int,Any}() + all_buffers_on_cuda &= ( + stack_template isa CUDA.CuArray && + stack_work isa CUDA.CuArray && + img1_f isa CUDA.CuArray && + img2_f isa CUDA.CuArray && + cc2x isa CUDA.CuArray && + nbuf isa CUDA.CuArray + ) copyto!(stack_work, stack_template) call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_param) @@ -214,7 +240,14 @@ for (i, (nx, ny, nz)) in enumerate(stack_sizes) )) end -serialize(result_file, rows) +serialize( + result_file, + ( + rows = rows, + cuda_info = _cuda_info(), + all_buffers_on_cuda = all_buffers_on_cuda, + ), +) """ function write_child_script() @@ -251,14 +284,42 @@ function run_ref( try run(cmd) commit = chomp(read(`git -C $checkout rev-parse --short HEAD`, String)) - rows = deserialize(result_file) - return (commit=commit, rows=rows) + payload = deserialize(result_file) + if payload isa NamedTuple && hasproperty(payload, :rows) + return ( + commit = commit, + rows = payload.rows, + cuda_info = hasproperty(payload, :cuda_info) ? payload.cuda_info : (functional = true,), + all_buffers_on_cuda = hasproperty(payload, :all_buffers_on_cuda) ? payload.all_buffers_on_cuda : false, + ) + end + + # Backward compatibility with older payload shape. + return ( + commit = commit, + rows = payload, + cuda_info = (functional = true,), + all_buffers_on_cuda = false, + ) finally rm(result_dir; force=true, recursive=true) rm(checkout; force=true, recursive=true) end end +function print_cuda_report(label::String, run_result) + info = run_result.cuda_info + device_name = hasproperty(info, :device_name) ? info.device_name : "unknown" + device_index = hasproperty(info, :device_index) ? info.device_index : "unknown" + driver = hasproperty(info, :driver_version) ? info.driver_version : "unknown" + runtime = hasproperty(info, :runtime_version) ? info.runtime_version : "unknown" + functional = hasproperty(info, :functional) ? info.functional : "unknown" + arrays_on_cuda = run_result.all_buffers_on_cuda ? "yes" : "no" + pad = repeat(" ", length(label)) + println(" ", label, ": functional=", functional, ", device=", device_name, " (id=", device_index, ")") + println(" ", pad, " driver=", driver, ", runtime=", runtime, ", arrays_on_cuda=", arrays_on_cuda) +end + function print_table(curr, prev, current_ref::String, previous_ref::String) curr_by_dims = Dict(r.dims => r for r in curr.rows) prev_by_dims = Dict(r.dims => r for r in prev.rows) @@ -268,6 +329,9 @@ function print_table(curr, prev, current_ref::String, previous_ref::String) println("CUDA reg_stack_translate! comparison") println("current: $(curr.commit) ($current_ref)") println("previous: $(prev.commit) ($previous_ref)") + println("CUDA verification:") + print_cuda_report("current", curr) + print_cuda_report("previous", prev) println() @printf("%-14s%14s%14s%12s%12s\n", "dims", "current_ms", "prev_ms", "curr/prev", "delta_%") From 62520953e657fa37113ea59400df484b6f74f332 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 13:32:27 +0000 Subject: [PATCH 19/40] Fix global scope mutation issue with benchmarking (GPU info) --- .../compare_reg_stack_translate_commits.jl | 94 ++++++++++--------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/benchmark/compare_reg_stack_translate_commits.jl b/benchmark/compare_reg_stack_translate_commits.jl index 19865ee..02c1b4b 100644 --- a/benchmark/compare_reg_stack_translate_commits.jl +++ b/benchmark/compare_reg_stack_translate_commits.jl @@ -192,54 +192,60 @@ function call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_p end end -rows = NamedTuple[] -all_buffers_on_cuda = true -for (i, (nx, ny, nz)) in enumerate(stack_sizes) - rng = MersenneTwister(seed + 100 + i) - dims = "$(nx)x$(ny)x$(nz)" - - stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, noise_sigma)) - stack_work = similar(stack_template) - img1_f = CUDA.zeros(ComplexF32, nx, ny) - img2_f = CUDA.zeros(ComplexF32, nx, ny) - cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) - nbuf = CUDA.zeros(Float32, nx, ny) - reg_param = Dict{Int,Any}() - all_buffers_on_cuda &= ( - stack_template isa CUDA.CuArray && - stack_work isa CUDA.CuArray && - img1_f isa CUDA.CuArray && - img2_f isa CUDA.CuArray && - cc2x isa CUDA.CuArray && - nbuf isa CUDA.CuArray - ) - - copyto!(stack_work, stack_template) - call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_param) - CUDA.synchronize() - stack_out = Array(stack_work) +function run_case_rows(stack_sizes, samples, evals, seed, noise_sigma) + rows = NamedTuple[] + all_buffers_on_cuda = true + for (i, (nx, ny, nz)) in enumerate(stack_sizes) + rng = MersenneTwister(seed + 100 + i) + dims = "$(nx)x$(ny)x$(nz)" + + stack_template = CUDA.CuArray(make_stack(nx, ny, nz, rng, noise_sigma)) + stack_work = similar(stack_template) + img1_f = CUDA.zeros(ComplexF32, nx, ny) + img2_f = CUDA.zeros(ComplexF32, nx, ny) + cc2x = CUDA.zeros(ComplexF32, 2 * nx, 2 * ny) + nbuf = CUDA.zeros(Float32, nx, ny) + reg_param = Dict{Int,Any}() + all_buffers_on_cuda = all_buffers_on_cuda && ( + stack_template isa CUDA.CuArray && + stack_work isa CUDA.CuArray && + img1_f isa CUDA.CuArray && + img2_f isa CUDA.CuArray && + cc2x isa CUDA.CuArray && + nbuf isa CUDA.CuArray + ) - trial = run(@benchmarkable begin - copyto!($stack_work, $stack_template) - empty!($reg_param) - call_reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf, $reg_param) + copyto!(stack_work, stack_template) + call_reg_stack_translate!(stack_work, img1_f, img2_f, cc2x, nbuf, reg_param) CUDA.synchronize() - end samples=samples evals=evals) - - med = BenchmarkTools.median(trial) - mn = BenchmarkTools.mean(trial) - mnm = BenchmarkTools.minimum(trial) - push!(rows, ( - dims = dims, - median_ms = med.time / 1e6, - mean_ms = mn.time / 1e6, - min_ms = mnm.time / 1e6, - memory_bytes = med.memory, - allocs = med.allocs, - stack_out = stack_out, - )) + stack_out = Array(stack_work) + + trial = run(@benchmarkable begin + copyto!($stack_work, $stack_template) + empty!($reg_param) + call_reg_stack_translate!($stack_work, $img1_f, $img2_f, $cc2x, $nbuf, $reg_param) + CUDA.synchronize() + end samples=samples evals=evals) + + med = BenchmarkTools.median(trial) + mn = BenchmarkTools.mean(trial) + mnm = BenchmarkTools.minimum(trial) + push!(rows, ( + dims = dims, + median_ms = med.time / 1e6, + mean_ms = mn.time / 1e6, + min_ms = mnm.time / 1e6, + memory_bytes = med.memory, + allocs = med.allocs, + stack_out = stack_out, + )) + end + + return rows, all_buffers_on_cuda end +rows, all_buffers_on_cuda = run_case_rows(stack_sizes, samples, evals, seed, noise_sigma) + serialize( result_file, ( From 90ad9e7185a8413ba557b8840cf410fba8a83463 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 13:54:33 +0000 Subject: [PATCH 20/40] Update doc with bench result --- README.md | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ab024fa..82f818a 100644 --- a/README.md +++ b/README.md @@ -92,14 +92,43 @@ end ``` ## Performance -Measured time to call `reg_stack_translate!` -Hardware: GTX 1080 -Julia v1.5.3 and CUDA.jl v.2.4.1 - -| size (x,y,z) | mean time (ms) | -| - | - | -| 32,32,32 | 43.817 ms | -| 64,64,64 | 91.215 ms | -| 128,128,64 | 103.022 ms | -| 256,256,64 | 131.046 ms | -| 256,256,256 | 525.257 ms | +### Benchmark command +```bash +julia --project=benchmark benchmark/run_benchmarks.jl --backend=both --samples=20 --sizes=64x64,128x128,256x256,512x512,2048x2048 --stack=128x128x128,256x256x256 --output=benchmark/results/both.csv +``` + +### Benchmark results + + +### Configuration +``` +CUDA toolchain: +- runtime 12.9, artifact installation +- driver 550.107.2 for 12.4 +- compiler 12.9 + +CUDA libraries: +- CUBLAS: 12.9.1 +- CURAND: 10.3.10 +- CUFFT: 11.4.1 +- CUSOLVER: 11.7.5 +- CUSPARSE: 12.5.10 +- CUPTI: 2025.2.1 (API 12.9.1) +- NVML: 12.0.0+550.107.2 + +Julia packages: +- CUDA: 5.10.1 +- GPUArrays: 11.4.1 +- GPUCompiler: 1.8.2 +- KernelAbstractions: 0.9.40 +- CUDA_Driver_jll: 13.2.0+0 +- CUDA_Compiler_jll: 0.4.2+0 +- CUDA_Runtime_jll: 0.20.1+0 + +Toolchain: +- Julia: 1.12.5 +- LLVM: 18.1.7 + +1 device: + 0: NVIDIA GeForce RTX 3060 (sm_86, 11.752 GiB / 12.000 GiB available) +``` \ No newline at end of file From 6557c7b6b415b6a8c70428d7090c8548102b43c3 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 13:54:47 +0000 Subject: [PATCH 21/40] Update the bench result --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 82f818a..666bef1 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,34 @@ julia --project=benchmark benchmark/run_benchmarks.jl --backend=both --samples=2 ``` ### Benchmark results - +Time in ms + +| backend | case | dims | median | mean | min | memory | allocs | +| :--- | :--- | :--- | ---: | ---: | ---: | ---: | ---: | +| cpu | dftreg | 64x64 | 0.090 | 0.115 | 0.088 | 400 | 7 | +| cpu | dftreg_subpix | 64x64 | 0.864 | 0.860 | 0.631 | 492568 | 263 | +| cpu | dftreg | 128x128 | 0.326 | 0.342 | 0.313 | 400 | 7 | +| cpu | dftreg_subpix | 128x128 | 4.465 | 4.393 | 3.797 | 1755928 | 263 | +| cpu | dftreg | 256x256 | 2.545 | 2.571 | 2.328 | 400 | 7 | +| cpu | dftreg_subpix | 256x256 | 101.268 | 104.862 | 15.536 | 6640424 | 285 | +| cpu | dftreg | 512x512 | 11.170 | 11.478 | 10.875 | 400 | 7 | +| cpu | dftreg_subpix | 512x512 | 198.892 | 194.983 | 67.973 | 25846328 | 295 | +| cpu | dftreg | 2048x2048 | 276.238 | 277.944 | 272.715 | 400 | 7 | +| cpu | dftreg_subpix | 2048x2048 | 2555.666 | 2555.666 | 2415.997 | 405360432 | 295 | +| cpu | reg_stack_translate | 128x128x128 | 868.029 | 861.984 | 828.896 | 290972976 | 41278 | +| cpu | reg_stack_translate | 256x256x256 | 37213.014 | 37213.014 | 37213.014 | 2233026768 | 88998 | +| cuda | dftreg | 64x64 | 0.965 | 0.976 | 0.650 | 14816 | 471 | +| cuda | dftreg_subpix | 64x64 | 2.499 | 2.511 | 2.278 | 127856 | 2397 | +| cuda | dftreg | 128x128 | 0.371 | 0.389 | 0.341 | 14848 | 472 | +| cuda | dftreg_subpix | 128x128 | 2.635 | 2.608 | 1.907 | 176448 | 2398 | +| cuda | dftreg | 256x256 | 0.383 | 0.397 | 0.340 | 14880 | 475 | +| cuda | dftreg_subpix | 256x256 | 2.741 | 2.738 | 2.082 | 273072 | 2428 | +| cuda | dftreg | 512x512 | 0.372 | 0.397 | 0.346 | 15184 | 494 | +| cuda | dftreg_subpix | 512x512 | 3.355 | 3.342 | 2.637 | 467232 | 2564 | +| cuda | dftreg | 2048x2048 | 2.382 | 2.383 | 1.952 | 22256 | 892 | +| cuda | dftreg_subpix | 2048x2048 | 13.917 | 13.958 | 12.945 | 1626624 | 2834 | +| cuda | reg_stack_translate | 128x128x128 | 341.053 | 341.947 | 337.756 | 26691536 | 405533 | +| cuda | reg_stack_translate | 256x256x256 | 739.277 | 739.101 | 734.337 | 79566528 | 824039 | ### Configuration ``` From a64da460d1b332c750ec1bfddc24093ea0b6a937 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:01:39 +0000 Subject: [PATCH 22/40] Update doc --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 666bef1..69be70e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,11 @@ using FFTW # CPU backend # using CUDA # CUDA backend ``` +Backend selection is determined by array type at call time: +- `CuArray` inputs use the CUDA extension (CUFFT/CUDA kernels). +- `Array`/`StridedArray` inputs use the CPU extension (FFTW). +- You can load both `CUDA` and `FFTW`; dispatch still follows the input array types. + ### Registering a set of 2D images ```julia # allocate GPU memory @@ -74,6 +79,7 @@ Array(img2_reg_g) ### Registering z-stack - Moving targets on the stage can cause shearing in z-stack. To correct this, the images within the stack are registered together. - `reg_stack_translate!` is a memory-efficient and convenient function to register the frames in each z-stack. Here in the example, the script loads the z-stack at each time point, registers it, and then saves the registered z-stack. +- To ensure this runs on CUDA: make all working arrays `CuArray`, check `CUDA.functional()`, and optionally set `CUDA.allowscalar(false)` to catch accidental scalar fallback. ```julia size_x, size_y, size_z = 256, 256, 94 img_stack_reg = zeros(Float32, size_x, size_y, size_z) @@ -86,11 +92,68 @@ N_g = CuArray{Float32}(undef, size_x, size_y) @showprogress for t = 1:100 copyto!(img_stack_reg_g, get_zstack(t)) # copy data to GPU reg_stack_translate!(img_stack_reg_g, img1_f_g, img2_f_g, CC2x_g, N_g) # register - copyto!(img_stack_reg, img_stack_reg_g) # copy result to GPU + copyto!(img_stack_reg, img_stack_reg_g) # copy result to CPU save_zstack(t, img_stack_reg) end ``` +### Registering z-stack in batches (CUDA, higher throughput) +If you have many stacks (`t = 1:nt`), process them in micro-batches to improve GPU utilization and overlap CPU I/O with GPU work. + +```julia +using FFTRegGPU +using CUDA +using ProgressMeter +using Base.Threads + +CUDA.functional() || error("CUDA is not functional") +CUDA.allowscalar(false) + +size_x, size_y, size_z = 256, 256, 94 +nt = 100 +B = 4 # micro-batch size; tune 2, 4, 8... + +# One independent workspace per batch slot. +h_in = [CUDA.pin(Array{Float32}(undef, size_x, size_y, size_z)) for _ in 1:B] +h_out = [CUDA.pin(Array{Float32}(undef, size_x, size_y, size_z)) for _ in 1:B] +d_stack = [CuArray{Float32}(undef, size_x, size_y, size_z) for _ in 1:B] +img1_f = [CuArray{ComplexF32}(undef, size_x, size_y) for _ in 1:B] +img2_f = [CuArray{ComplexF32}(undef, size_x, size_y) for _ in 1:B] +CC2x = [CuArray{ComplexF32}(undef, 2 * size_x, 2 * size_y) for _ in 1:B] +N = [CuArray{Float32}(undef, size_x, size_y) for _ in 1:B] +reg_param = [Dict{Int,Any}() for _ in 1:B] + +@showprogress for t0 in 1:B:nt + k = min(B, nt - t0 + 1) + + # Load stacks on CPU. + @threads for i in 1:k + get_zstack!(h_in[i], t0 + i - 1) + end + + # Process stacks concurrently on GPU. + @sync for i in 1:k + @spawn begin + empty!(reg_param[i]) + CUDA.@sync begin + copyto!(d_stack[i], h_in[i]) # H2D + reg_stack_translate!(d_stack[i], img1_f[i], img2_f[i], CC2x[i], N[i]; reg_param=reg_param[i]) + copyto!(h_out[i], d_stack[i]) # D2H + end + end + end + + # Save stacks on CPU. + @threads for i in 1:k + save_zstack(t0 + i - 1, h_out[i]) + end +end +``` + +Notes: +- Run Julia with multiple threads (e.g. `julia -t auto`) to benefit from `@threads`/`@spawn`. +- `B` is the main tuning parameter; increase it until throughput stops improving or GPU memory becomes limiting. + ## Performance ### Benchmark command ```bash @@ -158,4 +221,4 @@ Toolchain: 1 device: 0: NVIDIA GeForce RTX 3060 (sm_86, 11.752 GiB / 12.000 GiB available) -``` \ No newline at end of file +``` From 78238e24b8d16a9c5dafdf1145d3410bc50ef13b Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:16:08 +0000 Subject: [PATCH 23/40] Update doc (pin memory) --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 69be70e..16b7cc7 100644 --- a/README.md +++ b/README.md @@ -80,9 +80,10 @@ Array(img2_reg_g) - Moving targets on the stage can cause shearing in z-stack. To correct this, the images within the stack are registered together. - `reg_stack_translate!` is a memory-efficient and convenient function to register the frames in each z-stack. Here in the example, the script loads the z-stack at each time point, registers it, and then saves the registered z-stack. - To ensure this runs on CUDA: make all working arrays `CuArray`, check `CUDA.functional()`, and optionally set `CUDA.allowscalar(false)` to catch accidental scalar fallback. +- For repeated large host<->device transfers, use a long-lived pinned host buffer (`CUDA.pin`) for better copy throughput. ```julia size_x, size_y, size_z = 256, 256, 94 -img_stack_reg = zeros(Float32, size_x, size_y, size_z) +img_stack_h = CUDA.pin(Array{Float32}(undef, size_x, size_y, size_z)) img_stack_reg_g = CuArray{Float32}(undef, size_x, size_y, size_z) img1_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) img2_f_g = CuArray{Complex{Float32}}(undef, size_x, size_y) @@ -90,10 +91,11 @@ CC2x_g = CuArray{Complex{Float32}}(undef, 2 * size_x, 2 * size_y) N_g = CuArray{Float32}(undef, size_x, size_y) @showprogress for t = 1:100 - copyto!(img_stack_reg_g, get_zstack(t)) # copy data to GPU + get_zstack!(img_stack_h, t) # load data to pinned host buffer + copyto!(img_stack_reg_g, img_stack_h) # copy data to GPU reg_stack_translate!(img_stack_reg_g, img1_f_g, img2_f_g, CC2x_g, N_g) # register - copyto!(img_stack_reg, img_stack_reg_g) # copy result to CPU - save_zstack(t, img_stack_reg) + copyto!(img_stack_h, img_stack_reg_g) # copy result to CPU + save_zstack(t, img_stack_h) end ``` From 49dcdb89555d844f573dcb56045e03c95aa86143 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:35:28 +0000 Subject: [PATCH 24/40] Update doc --- src/FFTRegGPU.jl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/FFTRegGPU.jl b/src/FFTRegGPU.jl index 4215383..1ce1a9a 100644 --- a/src/FFTRegGPU.jl +++ b/src/FFTRegGPU.jl @@ -1,3 +1,15 @@ +""" + FFTRegGPU + +Phase-correlation based translation registration for 2D images with array-type +driven backend dispatch (CPU via FFTW, GPU via CUDA extensions). + +The core API expects Fourier-domain images (`fft(img)`) and exposes: +- `dftreg!` for integer-pixel translation estimation, +- `dftreg_subpix!` for subpixel translation estimation, +- `subpix_shift!` and `dftreg_resample!` for Fourier-domain shifting/resampling, +- `reg_stack_translate!` for sequential z-stack registration. +""" module FFTRegGPU using AbstractFFTs From 1c8448c4f20b1e6824610b9d443004227e62792b Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:35:35 +0000 Subject: [PATCH 25/40] Update doc --- ext/FFTRegGPUCPUExt.jl | 8 ++++++++ ext/FFTRegGPUCUDAExt.jl | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/ext/FFTRegGPUCPUExt.jl b/ext/FFTRegGPUCPUExt.jl index b9bc94f..813eede 100644 --- a/ext/FFTRegGPUCPUExt.jl +++ b/ext/FFTRegGPUCPUExt.jl @@ -1,3 +1,11 @@ +""" + FFTRegGPUCPUExt + +CPU extension for FFTRegGPU backend hooks. + +When `FFTW` is loaded and inputs are `StridedArray`s, FFTRegGPU internal hooks +dispatch to FFTW and AbstractFFTs shift operations. +""" module FFTRegGPUCPUExt using FFTRegGPU diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 57a1a4f..5665175 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -1,3 +1,11 @@ +""" + FFTRegGPUCUDAExt + +CUDA extension for FFTRegGPU backend hooks. + +When `CUDA` is loaded and inputs are `CuArray` (or views over `CuArray`), FFT +and shift operations dispatch to CUFFT/CUDA implementations. +""" module FFTRegGPUCUDAExt using FFTRegGPU From d79a575c95c5a6b35647cc1e956f9fa719fb8977 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:35:40 +0000 Subject: [PATCH 26/40] Update doc --- src/dftreg_translate.jl | 135 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index fa3b423..02c953b 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -1,15 +1,52 @@ +""" + _fft(inp) + _ifft(inp) + _ifft!(inp) + _fftshift(inp) + _ifftshift(inp) + +Internal backend hooks used by FFTRegGPU algorithms. + +These methods default to `AbstractFFTs` behavior and are extended in +`ext/FFTRegGPUCPUExt.jl` and `ext/FFTRegGPUCUDAExt.jl` so that dispatch follows +the input array type. +""" _fft(inp::AbstractArray) = fft(inp) _ifft(inp::AbstractArray) = ifft(inp) _ifft!(inp::AbstractArray) = copyto!(inp, _ifft(inp)) _fftshift(inp::AbstractArray) = fftshift(inp) _ifftshift(inp::AbstractArray) = ifftshift(inp) + +""" + _scalar_at(inp, idx) + +Read a scalar element from `inp[idx]`. + +CUDA extensions overload this helper with `@allowscalar` so peak extraction can +remain explicit and localized. +""" _scalar_at(inp::AbstractArray, idx) = inp[idx] +""" + _backend_template(inp) + +Return a parent array/container that represents where allocations should happen +for `inp` (for example the underlying `CuArray` for wrapped views). +""" _backend_template(inp::AbstractArray) = inp _backend_template(inp::SubArray) = _backend_template(parent(inp)) _backend_template(inp::Base.ReshapedArray) = _backend_template(parent(inp)) _backend_template(inp::Base.PermutedDimsArray) = _backend_template(parent(inp)) +""" + _to_backend(ref, src) + +Allocate a new array with the same backend/container family as `ref`, then copy +`src` into it. + +This is used to keep temporary arrays on the same device as the active +computation (for example CPU `Array` vs GPU `CuArray`). +""" function _to_backend(ref::AbstractArray, src::AbstractArray) tmpl = _backend_template(ref) out = similar(tmpl, eltype(src), size(src)) @@ -17,6 +54,14 @@ function _to_backend(ref::AbstractArray, src::AbstractArray) out end +""" + _findmax_abs2_loc(inp, [work]) + +Return the location of the maximum of `abs2.(inp)`. + +If `work` is provided, it must match `size(inp)` and is reused as a scratch +buffer to avoid allocating `abs2.(inp)`. +""" function _findmax_abs2_loc(inp::AbstractArray{<:Complex}, work::Union{Nothing,AbstractArray{<:Real}}=nothing) if work === nothing _, loc = findmax(abs2.(inp)) @@ -29,6 +74,16 @@ function _findmax_abs2_loc(inp::AbstractArray{<:Complex}, work::Union{Nothing,Ab loc end +""" + dftups(inp, no, usfac=1, offset=nothing) + +Compute an upsampled DFT region by matrix multiplication (Guizar-Sicairos style) +without zero-padding the full spectrum. + +`inp` is typically the Fourier-domain cross-power spectrum. `no` is the output +size per dimension, `usfac` is the upsampling factor, and `offset` optionally +sets the center offset (per-dimension) of the sampled DFT window. +""" function dftups(inp::AbstractArray{T,N}, no::Integer, usfac::Int=1, offset=nothing) where {T<:Number,N} no > 0 || throw(ArgumentError("no must be positive")) usfac > 0 || throw(ArgumentError("usfac must be positive")) @@ -55,6 +110,20 @@ function dftups(inp::AbstractArray{T,N}, no::Integer, usfac::Int=1, offset=nothi permutedims(out, collect(ndims(out):-1:1)) end +""" + dftreg!(img1_f, img2_f, CC; cc_abs2_work=nothing) -> (error, shift, diffphase) + +Estimate integer-pixel translation between two 2D images in the Fourier domain. + +`img1_f` and `img2_f` must be Fourier transforms of real images of equal size. +`CC` is a complex work/output buffer with the same size and is overwritten with +the inverse-FFT cross-correlation field. + +Returns: +- `error`: translation-invariant normalized RMS-like mismatch metric, +- `shift`: real-valued vector `(dx, dy)` to apply to `img2` to align to `img1`, +- `diffphase`: global phase difference (radians). +""" function dftreg!( img1_f::AbstractMatrix{T1}, img2_f::AbstractMatrix{T2}, @@ -94,6 +163,19 @@ function dftreg!( error, shift, diffphase end +""" + dftreg_subpix!(img1_f, img2_f, CC2x, up_fac=10; cc2x_abs2_work=nothing) + -> (error, shift, diffphase) + +Estimate subpixel translation between two 2D Fourier-domain images. + +Algorithm: +1. Build a 2x upsampled cross-correlation grid in `CC2x` for a coarse estimate. +2. Optionally refine the peak with matrix-multiply DFT (`dftups`) at `up_fac`. + +`CC2x` must be size `(2*size(img1_f,1), 2*size(img1_f,2))`. Returned `shift` +is the translation to apply to `img2` so it aligns with `img1`. +""" function dftreg_subpix!( img1_f::AbstractMatrix{T1}, img2_f::AbstractMatrix{T2}, @@ -174,6 +256,17 @@ function dftreg_subpix!( error, shift, diffphase end +""" + subpix_shift!(out, img_f, N, shift, diffphase) -> out + +Apply a subpixel translation and global phase correction directly in Fourier +space. + +`img_f` is the Fourier-domain moving image, `shift` is the translation vector, +`diffphase` is the global phase correction, and `N` is a real scratch matrix +matching `size(img_f)` used to accumulate the phase ramp. `out` is overwritten +with the shifted Fourier-domain image. +""" function subpix_shift!( out::AbstractMatrix{<:Complex}, img_f::AbstractMatrix{<:Complex}, @@ -203,6 +296,12 @@ function subpix_shift!( out end +""" + subpix_shift!(img_f, N, shift, diffphase) + +Allocation convenience method for [`subpix_shift!`](@ref) that returns a newly +allocated Fourier-domain output array. +""" function subpix_shift!( img_f::AbstractMatrix{<:Complex}, N::AbstractMatrix{<:Real}, @@ -213,6 +312,15 @@ function subpix_shift!( subpix_shift!(out, img_f, N, shift, diffphase) end +""" + dftreg_resample!(out, img_f, N, shift, diffphase; work_f=similar(img_f)) -> out + +Resample a Fourier-domain moving image into real-space after applying +translation/phase correction. + +This combines [`subpix_shift!`](@ref) with inverse FFT and writes the real part +to `out`. `work_f` is a complex scratch/output buffer for the shifted spectrum. +""" function dftreg_resample!( out::AbstractMatrix{<:Real}, img_f::AbstractMatrix{<:Complex}, @@ -231,6 +339,12 @@ function dftreg_resample!( out end +""" + dftreg_resample(img_f, N, shift, diffphase; work_f=similar(img_f)) + +Allocation convenience method for [`dftreg_resample!`](@ref) that returns a new +real-valued registered image. +""" function dftreg_resample( img_f::AbstractMatrix{<:Complex}, N::AbstractMatrix{<:Real}, @@ -243,6 +357,11 @@ function dftreg_resample( dftreg_resample!(out, img_f, N, shift, diffphase; work_f=work_f) end +""" + dftreg_resample!(img_f, N, shift, diffphase) + +Legacy convenience alias equivalent to [`dftreg_resample`](@ref). +""" function dftreg_resample!( img_f::AbstractMatrix{<:Complex}, N::AbstractMatrix{<:Real}, @@ -252,6 +371,22 @@ function dftreg_resample!( dftreg_resample(img_f, N, shift, diffphase) end +""" + reg_stack_translate!(img_stack_reg, img1_f, img2_f, CC2x, N; reg_param=Dict()) + +Register a 3D stack (`x, y, z`) by translating each plane `z` to align with the +previous registered plane `z-1`. + +The operation is in-place on `img_stack_reg`. `img1_f`, `img2_f`, `CC2x`, and +`N` are reusable work buffers: +- `img1_f`, `img2_f`: Fourier-domain work images (`size == size(img_stack_reg[:,:,1])`) +- `CC2x`: coarse cross-correlation buffer (2x in each planar dimension) +- `N`: real phase-ramp scratch buffer + +If `reg_param[z]` exists, it must contain `(error, shift, diffphase)` and is +reused instead of recomputing registration for plane `z`. Otherwise the tuple is +computed and stored. +""" function reg_stack_translate!( img_stack_reg::AbstractArray{<:Real,3}, img1_f::AbstractMatrix{<:Complex}, From a5ac63371fb80e8c551cffc56204a2630d390e58 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:52:37 +0000 Subject: [PATCH 27/40] Add CI workflow for testing --- .github/workflows/ci.yml | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cb7811d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,50 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + test: + name: Julia ${{ matrix.julia-version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + timeout-minutes: 20 + + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - macos-latest + julia-version: + - '1.11' + - '1.12' + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Julia + uses: julia-actions/setup-julia@v2 + with: + version: ${{ matrix.julia-version }} + + - name: Cache Julia artifacts + uses: julia-actions/cache@v2 + + - name: Instantiate project + shell: julia --color=yes --project=. {0} + run: | + using Pkg + Pkg.instantiate() + Pkg.precompile() + + - name: Run tests + shell: julia --color=yes --project=. {0} + run: | + using Pkg + Pkg.test() From 7f74312caa72176277c9369b8cab1fde74fb4bc2 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 14:53:41 +0000 Subject: [PATCH 28/40] Remove macOS and 1.11 for CI --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb7811d..f2667b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,16 +12,14 @@ jobs: test: name: Julia ${{ matrix.julia-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} - timeout-minutes: 20 + timeout-minutes: 10 strategy: fail-fast: false matrix: os: - ubuntu-latest - - macos-latest julia-version: - - '1.11' - '1.12' steps: From 816fbc56af6da276813d4abfc71660d164523b94 Mon Sep 17 00:00:00 2001 From: Jungsoo Kim Date: Fri, 13 Mar 2026 14:55:15 +0000 Subject: [PATCH 29/40] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 16b7cc7..378dd87 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # FFTRegGPU.jl +[![CI](https://github.com/urlicht/FFTRegGPU.jl/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/urlicht/FFTRegGPU.jl/actions/workflows/ci.yml) + Fast FFT GPU registration using [phase correlation](https://en.wikipedia.org/wiki/Phase_correlation). This GPU version is based on [SubpixelRegistration.jl](https://github.com/romainFr/SubpixelRegistration.jl) Currently it only supports translation. From b5ff3810b27ccca2b512aff4c265e8275569b350 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 18:00:13 +0000 Subject: [PATCH 30/40] Add images to doc --- README.md | 3 +++ docs/img/before_after_xy_slice.png | Bin 0 -> 186656 bytes docs/img/before_after_xz_MIP.png | Bin 0 -> 203067 bytes 3 files changed, 3 insertions(+) create mode 100644 docs/img/before_after_xy_slice.png create mode 100644 docs/img/before_after_xz_MIP.png diff --git a/README.md b/README.md index 378dd87..c9c6e4e 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ Currently it only supports translation. ## Usage and example +![before vs after registration showing a slice (xy)](docs/img/before_after_xy_slice.png) +![before vs after registration showing xz MIP for a volume](docs/img/before_after_xz_MIP.png) + ### Backend setup Load FFTRegGPU with the backend package you want to use: diff --git a/docs/img/before_after_xy_slice.png b/docs/img/before_after_xy_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..cf705e057f2749e27f326915dffc6c60586af85a GIT binary patch literal 186656 zcmdqJWmr^S_diUBq@aX!$cS{q5F?^=C@3K~+p{BHpMgkUV(u00RSqL`m_LCI$wU zHwFf#3IX1IPI-ZH;r#{EMN{D=M)@%P&izfNg|3pNni|IQ`!oRt9wr3__FtBJ!oYlj zf%{Jy14A2=?!VJUn9u&rgLTg%fN}qeA$WgUhFN3a{F^`J{`&VYzd!FK{p+e`>gs6g z;A(6Ak=fnC*~QwyUWiwKpI4ll*~-<`(FMrIXZPP6ybjJ_J`4=(Y|Q`BCmZX(H># zUVc`Y2h7aOQqJa%M_}fB)eV;N|E0e=2t0*#Fk=KT1JN9sgD6pH}^=GO53!fEv!$7WeA@RZ2!c>L2m{ zk@r8!N!?2a$~jw@x;i+&b8xVg`G4(jDZc+(#J{CW@%^>O|FX}&jQ>yWz4c`t+?V_> zPs%)a*-Tu3f$;)E>6Pp|2AI zmNo@HiSl52?{)Ehve-pE1L(H9P}1mjKj1&7dWhIroBVIOSN1bGSxYap6_rA?|Uwu<~PR_s3!6 z2-(3r>@-2_GPqbg9>K>1^mj>dsqW9X+hyn*xK^PPY?P9t+W@18j`CpQS`Jcw1 zM_0UCx4fUUk<+%Va<#4^-W#925A(k}y1QMmgP+@xkx3!iiCB#5|K(@@{3n-<71xbZ z7hG*fuCT1@hAheEHObaBqdO1(3lAprWE)B+Yy`bOBGWu_-8{0=8A6n?@4K|+YvjZo zrK9@aWMDmkbh3rV8zwSM7l?s;TG~q-|2YucUQ~B zl6U=9ruVt1m(+EL@ny&&W=-Q+{e_v#rWvXKIoQ8;4Z?mSVtgWk53Rm}%;bJtDK5+e z`b>d+r&j)Ydhpr-J=ErT8LV*`+{I;d9GNuY?|{H_aD?1l_}_JT_-%PGE}?$FQ7@7j zB5U_9N6@n%$(tW-XLSSEd=}Fc##!rJM*nyovh;+%ff9YzhMo@lTTI4hu+B%tRlsOoeIcR6xNb5bAMW)8i(=wGOgq7$=s?OYc)%)05%qHkSSXaJnR>*GJ$)s*(Vs3Q-KL7Ntt~)gRuIbdufPRs)m{AM^db8~r6n>yw|) z&Q4bk;OGOgO#2(CKT?DA?lcQM-c{#2U&kP`n=7-6Fod5OX5^)kqhVyXu$7fCrbE5; zn9J}OaR}7jX&G^EN40O{4TF8)<4D{J_`ibFJ z=;2k^rQ^4uGgUXV*kzWU=qEDu!oGxyo8-oS`UQs~fL30kN$?nWrE#|dIzawrq1w71 z7Lx8M-6MB5Bh-FTbO6uz{#iSSQ^N1-RX+6U{PMjM;2$n^{Lgfb5Yzs*)1dw@41l)# z(c0R@UX|++f8q~FHDAKJtGl;nlEU!(0-kZ|zvlI=v3CC}zPtQZHp(C0rO#)~&II(L z4$V{39|JV_-BX0yiuZ>RMn`8x08gYNvX3ohK|8^W2jHpfgse(#DMN6F53VuY1o=DC zEe)jel9ct8B))`DkqA_%4L+I-3lY-IcGBY=5G4blrM1pUVxp zt_FG2&6A;*$y#~Z1PfLEE-;O#lgU<*;RJ|m*T!*hoi+SK8eSb^n^AmXr6Vyuh~(=uHQs2_25Ej2msg z`vq&cq5>~H`nvyq6tt$qwdA41WDezI*5yhPu0juqM#({zn7b-CHUU8u;y?Onari?GDBz* z<*8urac~S&M9=c@I?%uHcmq+9O>*X{0)0Fhbmv%|JFs4Iat7xmQ$iBvUuSt9n1J?JA9o@wE>U;E(LkuVmD?>0r8%g*TrS zl)F41p+c{KZo z>lwGd95hH(!smDV<@&U%@I&kVVCz1j{0LQ!Z%luA8FP1ut!s3%4R}v4m%5dl)#Hk( zUWlhYea%rSQc?Z{Qc&k~;u!#KhBzUQ(2H%7{Q+w&)>q405n{$`Hz@5?F|(6WI$ssh zuvCv`uos<04uzPdxuP*mNr;HYFjPL0&6 zxdxJp0dUoL+rJhAk{Q)*{s*=p%AWLrv(>Bi+>w8$-;qdYvZy-JX$^XFx;DPl^ZGOw zgvtfz6=hyJ%UW^*ZkCAe`%Rl~{78NJ`n>0vmM73T{`Ibs45i3h_09SEt3QLJ`Vr%W z0YcwgfrXW&@Bb6UsbKHfE&P80?X*N@2amop`ed@TU3>JU#oZRCPX7K^-G#5Q2YWM; zG7S!NpInwswil=FZ-niWWg$7Uocjv-P%KJtDx`k?{jhDj&?y~#KmRYBe1}cK&2(}1 zqWH_kSi3PLN%}X9ic67@I?uE^37_9OKEIdT{J}7*X#d~sqSXJw0x1bKM60h05hPROqrFeYlMu^YY}2z7M~#_*oE5Dh&l<(5BF_TQPD9zWCFy5bFfnhov|6r5 zV@JDhxMO9VHWZ`o9?oM8<6`(Nwgr1@(xx2C;&Es{IrzOVPR{LkzEKj*l$@K22^E}c z#O0cOd(i#unRg~zO_RsBPNFlXksWyG$FJA!b6>tQWOgTB;;-!+0N?u?PJ;sAT}iHr z#PU~4NHH_vx+}3L=Zr5|63_?bpw`hpyi009#?VyxWOHm3EkVl7)pD#EaiyLYmwYbP zWz@?*&H z3}b*zU~`su{U>teYca=_WLk#&W%@RT40t$brD=E}NAlodc*vA=QFJ=)1BK5)zNLw< zIzlk!wtOakjvJF}8%1{fEgqg+x#!)?wV)#6kfg=kxR*=n($XC28i`9y=67i1o3Zbz z_Zu_(`>sRhiPxBzbH=5$$wjB2qLgc-E(5izC~YTYRx$7Pw<%^y^Tr=7o2`md-dJF= z3!H}s8;C=Vw=l9NZk&$&TXVPiRo*lfL#3`2;@q79WzpJg3q zk7jvq`=$O1OX6gUr>ki*Hv&bzs!6yS|by} z2LG%8emc1odq9y9B@2d)Z%mSBw~22b^EVvgq{%?rN}`_&u@tw*){173Ek6C3V3WH! zr8H*2OWKz&gMGA1eshD(se$I$VlLR5eO9xhp~v!@gzWXy$;w&e#B>BWSUUM8DDFt! zB&HB)K2HXgD3{Z!#mW5r3yxzY`|qx*XzAchOAM{A41WHOY=ij=!V(^8+pmO% zixXdKyf@emds6#V89dogVAnEAObgq#`M#s^T@W0gCcE~o!;p&Ges`-+zPDo~yc}0O zT8EW9_4t9F8?@*rQhBcXRGyboPV@(S9WM6&LdusXw+sJ1V>8Z=RgtliHk0iq5s^6x=a;9Y zn;(zh&G_Cm+VyZx*n-d}5f+ju?)Flkhnsm99@?SWB*3W3-XHKj%jBtPr3rTjW!{yY zBc$A$b?vIpJiRj4d)8r2Q>^r(9jpGp%-Jl>#MSzd5-q$_{-_^B$>0}UzIkbfOJ_Zw zZEaOvAR|nz)qfVH2cnnj)P83Uv>Hl`jAUOUvO>xPY^tWc z@nz&P^J+gco4$kBPPGL|%QiiMk2UL2mVT*QyN!(zG2q;%tA%nY3}(Y_WFz z>QfZ`!g3L~hoVy-I6m@uK{wWGk*&f0%MJ(fypb>YdSMcwwcwQV@doIK-*FOEU?-(< zs-sr(7h1kOZzw!i-MGLb^Ef;oqFVRBAuE@}#)h$+{-}Od8;T*|X&qVda5!*z8yi!J zLDmI3wr@zgP@|c3U|9gqmsDu z8;GmwgyGkP4q>ctAdmj=D-OGKcJofAUB;4qqp`)Cj0;3eyjhne&*oU7v%)# z{}}Zl+;MRHIw1p{29K-*YFfLAAtr4o)J1b@<^r#dCtu!C5b&ygXTN%Mx#+1{B^JN_ z};QXAm$~NttRnKgzxgYg`1$yrXpf*aAGnN3xiHaNQlYuHSOt{9JXnE ziT-wdqEg2xXwG3Z*XWC;fP^J87e%A;s61V}?WbP-_96TnGj`f~hNEyp3?J9;GNTv| zmd0=Nm$6#vpM!k{PjMlM9_R>g7%?xI0B-2k#P_#;lgtW3sT`|DPAYG;mY zD6hZ8vzXeehZ>6~(*rkJg|O><8nTcE%j^8DVfxTH=J0QS+AyErXm=zn-jTH;*Im>a z)oC8er_p5fW~tj!4^c>M+yyHsrJM?s9gZm5p!MZ}L}sdvfDpby_cNz+VJ1Myg22 zs(nJIWK(rhd2HPlppQExApP^cl`cuEi<iQNMzKf{=Wvdf5Zh`eN zpW<7o8aV7Vn;w2N_1MTUaBuEqeOery$l-pLn4*ru^~O|T@_q}qPcMC? zZ<#@*PfINKm;{8XP)%hRA5SsVf4Ld;f7z*W|27lcDiv0~LS(}G-G&mvG#;YBp!d0j zkYmIsoJ?c;5F@Z}^jXOIu6mqT=OcKiQm|}i=KBU>JfYAvW#3@4Ix*HZLdBI{JQ|qw z1Ajf4ax{;Zi%WA#>oT-l)lgxi$v+J^{WjO3d+VwwVbVUn?V*{gT$`Bhkj|9HA9QXs_XV9C^rN8#1_(su};fOJp**8kBtXQ^DvmUOf`Z#(bNpeE?5T?r+FaX|>xmuJz zgrB;0n6&2LkCoLCX9_-eDY-)7(ni6#A5Qfy>GK~@V;KfgXg`{e`SC{u3upn@Zkc`( zx^O~z>iIlSp^E7$j>!|!ROj8)CD}4A$hq1r@4-cFKz_QEJvm+$Qt)NrE#b1s z;*N?ZlYXIdsZNe0r6WN?`&%=%chf6EBW$!Mup&FWq0Qj_4@uj(E@y5V%|i2+>I(C+ zOdn#xKS)bahd%EBcxLaaNx7EM#PvRZvArWJrql$Rj}R8fjckZiki7m`-=*H?4Sr*E z)2+qL4`icerk%_gGvs5LvtYDHd(*+ivdSY~N+|511`dIOq}@6r!DIBmB!uKFkpUC* zq$aeDm}#292l(f=y5Xt#^@cT?2XeZ!xO(bxX84>W0o~VD{q*4dH6s;b9E7)HJ~y;Ab%fz*x73 zug(3b)cg5%htR24r3Wd?u%9YxD!02SwGOrrZe@^33T{m_s6JOsi^BqT9!u;wET4(0 z(<2b@8EsG?*v(&SyvW;v=t%XKL93KrH_}@t^!pqsms}qDAk`ZW{RDuWb+xM8!_-Y<)L)m} zC2P$t@=_^dyjft|gA-86zT!Z<9ErkauZdaFFcm}mxTE0+FE}83J5Xbbtgurl%d(rA zXv2M|?`6+qqf!noeXct~JJVfEz;tfP@<(qmq5npY5mXMxRAEe)0Zih} zf1eT%eS#+nEW1H;n!O67Z~IJ))L1U9FO4S!!s60iXRMe^x$t$k z{Y*_C*tuAOIem9$-zz>V)zezfZ@YQ#Z$6)tPS+}WMy%OB5NrGZ)RBcduPl8UYImS*5t2}%AySC zP#TVNBi`l<7&F zD#{gQ@MD2Pro`j%-hi6>^k)0S_F0REk~G6AEt6BFFZQ44eLR`dHhuuUr+rF>~a{=#&VZo>MXb6ebeOpx!d=nmM?0KwMpUu;eli5UAxGCxFF@9 zV>%ql1qQtY2o3`uwv_6OvDBs;wiM&PlQVbSkrJklS3fw^Uquo$%m0QsPxj;Zvnl!# z1QD4d^c&iDWH%GeLaB6hn1C`>Mc6~p&90F6j@<(_;U$>hYI)kaA{}mrq$x|fHiu%= zAB)fPza@n-JDgu!r_u{ECR%wjV!8sD1!28Xx`wUhBNhtn=3m%~(v`UQ?nXI6zhnSa zx#Kt*BuN{qQFim~E1QBT=j1Qy#wlGmQXDgVbC^9T*E~;{14VWCoo?76!zPp;IGY)GeX*rF?Q@ zz$gjRhyPJApv5XJmrr7RzV_}#rckn>D`f7B-8<`*(-;AzWA0p(Y35$Dyo-W?~a=mA#U~ z#!)wd4F<)+b0iJQLDp&)u8hM1Nx^9o8)m-{a@-D_c8c=gbzcyW-fyq39Cs33o6v>z zTB%;r{ZXWBZNy*k&iVh?ymW*cEwSUBl(DO$&`4efpZYi{VHvcis7C||A1X%3d zjo`y6@>4K|X=g4cg9+nF;d6nWvyqNyh8VS-uf??~NB zr34J8+d{<1@2UyY#Xl!K)zf~M5VKF2(8q(|GvZaPIpgxPR^7-%hQ*v)1Md2dj!#^3 ztpmOA2L;W(Ahmi0w>=@J++zFRbl@8Xpq}j$A&qv(bnbeGWV8{%MJ!fbCyBG@^sl{P2z(5msz!C z-yuV`0xV5?i#@fCLC!kpYrGA5v#Jbwz}&7zQ<)|)1u9kD@p+=rr}c-lb`#!1BVJcGS0x(_ zfJjb;SXB6grS#*gJ_&fuQnQhXmGdMahrQuClXIB4$GfqT%;;HbOcysKwBA`B@AhCw z4=Q_OBNp*^hdOZ9=|{QC$(Xj3gzmXPuOu!38R^6j10nKo`KdAB(Kjwmg$mgEfhOeh zhER$=!Eh-5$3B{;`(T6hmFPEgjBfQSjlCXQ!j&?s>1X&Y^S--W13~VuHKs8brYyA* z$~`~8-tX5pDandcGQobwOB(FQXKwJ=?!u$kL{}gDapT~J3N6mtB+NIA8lO3=+$#1s zIMg01-NT-0m365PxBA-|9jk={LWnP84VlWuCv+`(p>0a0*t!%w1rbWrB2l0~8tv7? zs=PnnqkIr)Fvor@c4w9Wi@MR_+l{2E*pdy5Yq!$=sLB>LY?C1GKGrF`vjZ@0O!io0s0CPZaP-26i1o55dXyV__#TFJ6

IbPaLbIT$Q27n4~8T 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

uFCMD*kpia@n`ItbZGh*U#G*?C&5PdMn>-3 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 z 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

_{MTTgEmvpE@X62&gbnmXFyNF1zVJ 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 z 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 literal 0 HcmV?d00001 From 409fdac06bf0a0d80003158a6b5bfe31bf977fa4 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 20:41:10 +0000 Subject: [PATCH 31/40] Optimize reg_stack_translate! by using plan fft (CPU) --- ext/FFTRegGPUCPUExt.jl | 5 ++++- src/dftreg_translate.jl | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ext/FFTRegGPUCPUExt.jl b/ext/FFTRegGPUCPUExt.jl index 813eede..23c8a7d 100644 --- a/ext/FFTRegGPUCPUExt.jl +++ b/ext/FFTRegGPUCPUExt.jl @@ -13,11 +13,14 @@ using FFTW using AbstractFFTs import FFTRegGPU: _fft, _ifft, _fftshift, _ifftshift -import FFTRegGPU: _ifft! +import FFTRegGPU: _ifft!, _plan_fft_inplace, _fft_inplace! _fft(inp::StridedArray) = FFTW.fft(inp) _ifft(inp::StridedArray) = FFTW.ifft(inp) _ifft!(inp::StridedArray{<:Complex}) = FFTW.ifft!(inp) +_plan_fft_inplace(inp::StridedArray{<:Complex}) = FFTW.plan_fft!(inp) +_fft_inplace!(inp::StridedArray{<:Complex}) = FFTW.fft!(inp) +_fft_inplace!(inp::StridedArray{<:Complex}, plan::FFTW.cFFTWPlan) = (plan * inp) _fftshift(inp::StridedArray) = AbstractFFTs.fftshift(inp) _ifftshift(inp::StridedArray) = AbstractFFTs.ifftshift(inp) diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index 02c953b..626223e 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -2,6 +2,9 @@ _fft(inp) _ifft(inp) _ifft!(inp) + _plan_fft_inplace(inp) + _fft_inplace!(inp) + _fft_inplace!(inp, plan) _fftshift(inp) _ifftshift(inp) @@ -14,6 +17,10 @@ the input array type. _fft(inp::AbstractArray) = fft(inp) _ifft(inp::AbstractArray) = ifft(inp) _ifft!(inp::AbstractArray) = copyto!(inp, _ifft(inp)) +_plan_fft_inplace(inp::AbstractArray{<:Complex}) = nothing +_fft_inplace!(inp::AbstractArray{<:Complex}) = copyto!(inp, _fft(inp)) +_fft_inplace!(inp::AbstractArray{<:Complex}, ::Nothing) = _fft_inplace!(inp) +_fft_inplace!(inp::AbstractArray{<:Complex}, plan) = _fft_inplace!(inp) _fftshift(inp::AbstractArray) = fftshift(inp) _ifftshift(inp::AbstractArray) = ifftshift(inp) @@ -383,6 +390,9 @@ The operation is in-place on `img_stack_reg`. `img1_f`, `img2_f`, `CC2x`, and - `CC2x`: coarse cross-correlation buffer (2x in each planar dimension) - `N`: real phase-ramp scratch buffer +Forward FFTs are executed in-place on `img1_f`/`img2_f`; when supported by the +active backend (for example FFTW), plans are reused across all z-planes. + If `reg_param[z]` exists, it must contain `(error, shift, diffphase)` and is reused instead of recomputing registration for plane `z`. Otherwise the tuple is computed and stored. @@ -399,13 +409,17 @@ function reg_stack_translate!( CC2x .= zero(eltype(CC2x)) N .= zero(eltype(N)) cc2x_abs2_work = similar(CC2x, float(real(eltype(CC2x)))) + fft_plan1 = _plan_fft_inplace(img1_f) + fft_plan2 = _plan_fft_inplace(img2_f) for z = 2:size_z z1, z2 = z - 1, z img1 = view(img_stack_reg, :, :, z1) img2 = view(img_stack_reg, :, :, z2) - img1_f .= _fft(img1) - img2_f .= _fft(img2) + img1_f .= img1 + _fft_inplace!(img1_f, fft_plan1) + img2_f .= img2 + _fft_inplace!(img2_f, fft_plan2) if !haskey(reg_param, z) error, shift, diffphase = dftreg_subpix!(img1_f, img2_f, CC2x; cc2x_abs2_work=cc2x_abs2_work) From 17a854a186244c41ea9c1d252f6f470676ade96b Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 20:46:53 +0000 Subject: [PATCH 32/40] Add support for plan/inplace fft for CUDA --- ext/FFTRegGPUCUDAExt.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 5665175..6e3aef8 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -12,10 +12,15 @@ using FFTRegGPU using CUDA import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at +import FFTRegGPU: _plan_fft_inplace, _fft_inplace! _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) _ifft!(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.ifft!(inp) +_plan_fft_inplace(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.plan_fft!(inp) +_fft_inplace!(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.fft!(inp) +_fft_inplace!(inp::CUDA.CuArray{<:Complex}, ::Nothing) = CUDA.CUFFT.fft!(inp) +_fft_inplace!(inp::CUDA.CuArray{<:Complex}, plan) = (plan * inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] From 842b0bcc1be7b41a4f9ba0c0747f774f5cbe2347 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:24:10 +0000 Subject: [PATCH 33/40] Update the benchmark result with the latest (plan fft) --- README.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c9c6e4e..32172fd 100644 --- a/README.md +++ b/README.md @@ -172,30 +172,30 @@ Time in ms | backend | case | dims | median | mean | min | memory | allocs | | :--- | :--- | :--- | ---: | ---: | ---: | ---: | ---: | -| cpu | dftreg | 64x64 | 0.090 | 0.115 | 0.088 | 400 | 7 | -| cpu | dftreg_subpix | 64x64 | 0.864 | 0.860 | 0.631 | 492568 | 263 | -| cpu | dftreg | 128x128 | 0.326 | 0.342 | 0.313 | 400 | 7 | -| cpu | dftreg_subpix | 128x128 | 4.465 | 4.393 | 3.797 | 1755928 | 263 | -| cpu | dftreg | 256x256 | 2.545 | 2.571 | 2.328 | 400 | 7 | -| cpu | dftreg_subpix | 256x256 | 101.268 | 104.862 | 15.536 | 6640424 | 285 | -| cpu | dftreg | 512x512 | 11.170 | 11.478 | 10.875 | 400 | 7 | -| cpu | dftreg_subpix | 512x512 | 198.892 | 194.983 | 67.973 | 25846328 | 295 | -| cpu | dftreg | 2048x2048 | 276.238 | 277.944 | 272.715 | 400 | 7 | -| cpu | dftreg_subpix | 2048x2048 | 2555.666 | 2555.666 | 2415.997 | 405360432 | 295 | -| cpu | reg_stack_translate | 128x128x128 | 868.029 | 861.984 | 828.896 | 290972976 | 41278 | -| cpu | reg_stack_translate | 256x256x256 | 37213.014 | 37213.014 | 37213.014 | 2233026768 | 88998 | -| cuda | dftreg | 64x64 | 0.965 | 0.976 | 0.650 | 14816 | 471 | -| cuda | dftreg_subpix | 64x64 | 2.499 | 2.511 | 2.278 | 127856 | 2397 | -| cuda | dftreg | 128x128 | 0.371 | 0.389 | 0.341 | 14848 | 472 | -| cuda | dftreg_subpix | 128x128 | 2.635 | 2.608 | 1.907 | 176448 | 2398 | -| cuda | dftreg | 256x256 | 0.383 | 0.397 | 0.340 | 14880 | 475 | -| cuda | dftreg_subpix | 256x256 | 2.741 | 2.738 | 2.082 | 273072 | 2428 | -| cuda | dftreg | 512x512 | 0.372 | 0.397 | 0.346 | 15184 | 494 | -| cuda | dftreg_subpix | 512x512 | 3.355 | 3.342 | 2.637 | 467232 | 2564 | -| cuda | dftreg | 2048x2048 | 2.382 | 2.383 | 1.952 | 22256 | 892 | -| cuda | dftreg_subpix | 2048x2048 | 13.917 | 13.958 | 12.945 | 1626624 | 2834 | -| cuda | reg_stack_translate | 128x128x128 | 341.053 | 341.947 | 337.756 | 26691536 | 405533 | -| cuda | reg_stack_translate | 256x256x256 | 739.277 | 739.101 | 734.337 | 79566528 | 824039 | +| cpu | dftreg | 64x64 | 0.059 | 0.066 | 0.059 | 400 | 7 | +| cpu | dftreg_subpix | 64x64 | 0.403 | 0.419 | 0.400 | 492568 | 263 | +| cpu | dftreg | 128x128 | 0.203 | 0.214 | 0.202 | 400 | 7 | +| cpu | dftreg_subpix | 128x128 | 4.515 | 4.310 | 3.885 | 1755864 | 263 | +| cpu | dftreg | 256x256 | 2.944 | 2.951 | 2.912 | 400 | 7 | +| cpu | dftreg_subpix | 256x256 | 96.249 | 86.929 | 19.879 | 6640136 | 285 | +| cpu | dftreg | 512x512 | 17.250 | 17.164 | 15.607 | 400 | 7 | +| cpu | dftreg_subpix | 512x512 | 202.291 | 194.513 | 76.812 | 25846040 | 295 | +| cpu | dftreg | 2048x2048 | 282.298 | 283.155 | 278.946 | 400 | 7 | +| cpu | dftreg_subpix | 2048x2048 | 3731.667 | 3731.667 | 3575.166 | 405360272 | 295 | +| cpu | reg_stack_translate | 128x128x128 | 584.774 | 590.850 | 582.729 | 224239024 | 38492 | +| cpu | reg_stack_translate | 256x256x256 | 29150.903 | 29150.903 | 29150.903 | 1697874352 | 83396 | +| cuda | dftreg | 64x64 | 0.613 | 0.631 | 0.577 | 15120 | 488 | +| cuda | dftreg_subpix | 64x64 | 1.487 | 1.487 | 1.084 | 128000 | 2406 | +| cuda | dftreg | 128x128 | 0.219 | 0.240 | 0.216 | 15088 | 476 | +| cuda | dftreg_subpix | 128x128 | 1.560 | 1.575 | 1.077 | 176576 | 2406 | +| cuda | dftreg | 256x256 | 0.220 | 0.241 | 0.216 | 14976 | 481 | +| cuda | dftreg_subpix | 256x256 | 1.631 | 1.659 | 1.203 | 273152 | 2434 | +| cuda | dftreg | 512x512 | 0.223 | 0.241 | 0.217 | 15264 | 499 | +| cuda | dftreg_subpix | 512x512 | 2.090 | 2.034 | 1.396 | 467408 | 2575 | +| cuda | dftreg | 2048x2048 | 1.845 | 1.853 | 1.619 | 24432 | 1028 | +| cuda | dftreg_subpix | 2048x2048 | 13.527 | 13.277 | 12.191 | 1632336 | 3147 | +| cuda | reg_stack_translate | 128x128x128 | 198.666 | 228.952 | 182.387 | 25326976 | 369055 | +| cuda | reg_stack_translate | 256x256x256 | 410.275 | 413.359 | 394.183 | 76830816 | 751483 | ### Configuration ``` From ae4de26d2a6e10f352dc075fdb3fe86bccb0e2ab Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:38:57 +0000 Subject: [PATCH 34/40] Update benchmark toolchain info --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 32172fd..e1a0202 100644 --- a/README.md +++ b/README.md @@ -200,32 +200,32 @@ Time in ms ### Configuration ``` CUDA toolchain: -- runtime 12.9, artifact installation -- driver 550.107.2 for 12.4 -- compiler 12.9 +- runtime 13.2, artifact installation +- driver 570.181.0 for 13.2 +- compiler 13.2 CUDA libraries: -- CUBLAS: 12.9.1 -- CURAND: 10.3.10 -- CUFFT: 11.4.1 -- CUSOLVER: 11.7.5 -- CUSPARSE: 12.5.10 -- CUPTI: 2025.2.1 (API 12.9.1) -- NVML: 12.0.0+550.107.2 +- CUBLAS: 13.3.0 +- CURAND: 10.4.2 +- CUFFT: 12.2.0 +- CUSOLVER: 12.1.0 +- CUSPARSE: 12.7.9 +- CUPTI: 2026.1.0 (API 13.2.0) +- NVML: 12.0.0+570.181 Julia packages: -- CUDA: 5.10.1 +- CUDA: 5.11.0 - GPUArrays: 11.4.1 - GPUCompiler: 1.8.2 - KernelAbstractions: 0.9.40 - CUDA_Driver_jll: 13.2.0+0 - CUDA_Compiler_jll: 0.4.2+0 -- CUDA_Runtime_jll: 0.20.1+0 +- CUDA_Runtime_jll: 0.21.0+0 Toolchain: - Julia: 1.12.5 - LLVM: 18.1.7 1 device: - 0: NVIDIA GeForce RTX 3060 (sm_86, 11.752 GiB / 12.000 GiB available) + 0: NVIDIA GeForce RTX 4060 Ti (sm_89, 15.581 GiB / 15.996 GiB available) ``` From 266c18992fbf1b2df66d86a7c594973f606c078b Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:40:52 +0000 Subject: [PATCH 35/40] Added direct FFT-order embedding helper --- src/dftreg_translate.jl | 52 ++++++++++++++++++++++++++++++++++++----- test/unit_tests.jl | 23 ++++++++++++++++++ 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/dftreg_translate.jl b/src/dftreg_translate.jl index 626223e..65a18f6 100644 --- a/src/dftreg_translate.jl +++ b/src/dftreg_translate.jl @@ -170,6 +170,51 @@ function dftreg!( error, shift, diffphase end +""" + _embed_crosspower_2x!(CC2x, img1_f, img2_f) -> CC2x + +Write the 2x zero-padded cross-power spectrum directly in native FFT order. + +This is equivalent to constructing `fftshift(img1_f) .* conj.(fftshift(img2_f))` +in the centered region of `CC2x` and then applying `ifftshift(CC2x)`, but avoids +materializing the shifted arrays. +""" +function _embed_crosspower_2x!( + CC2x::AbstractMatrix{TC}, + img1_f::AbstractMatrix{T1}, + img2_f::AbstractMatrix{T2}, +) where {TC<:Complex,T1<:Complex,T2<:Complex} + size(img1_f) == size(img2_f) || throw(DimensionMismatch("img1_f and img2_f must have the same size")) + m, n = size(img1_f) + expected_cc_size = (2m, 2n) + size(CC2x) == expected_cc_size || + throw(DimensionMismatch("CC2x must have size $(expected_cc_size), got $(size(CC2x))")) + + fill!(CC2x, zero(TC)) + + h1, t1 = cld(m, 2), fld(m, 2) + h2, t2 = cld(n, 2), fld(n, 2) + + in1_h, in1_t = 1:h1, (h1 + 1):m + in2_h, in2_t = 1:h2, (h2 + 1):n + out1_h, out1_t = 1:h1, (2m - t1 + 1):(2m) + out2_h, out2_t = 1:h2, (2n - t2 + 1):(2n) + + @views @. CC2x[out1_h, out2_h] = img1_f[in1_h, in2_h] * conj(img2_f[in1_h, in2_h]) + + if t2 > 0 + @views @. CC2x[out1_h, out2_t] = img1_f[in1_h, in2_t] * conj(img2_f[in1_h, in2_t]) + end + if t1 > 0 + @views @. CC2x[out1_t, out2_h] = img1_f[in1_t, in2_h] * conj(img2_f[in1_t, in2_h]) + end + if t1 > 0 && t2 > 0 + @views @. CC2x[out1_t, out2_t] = img1_f[in1_t, in2_t] * conj(img2_f[in1_t, in2_t]) + end + + CC2x +end + """ dftreg_subpix!(img1_f, img2_f, CC2x, up_fac=10; cc2x_abs2_work=nothing) -> (error, shift, diffphase) @@ -197,18 +242,13 @@ function dftreg_subpix!( # initial estimate by 2x upsample dim_input = size(img1_f) - ranges = [(x + 1 - div(x, 2)):(x + 1 + div(x - 1, 2)) for x in dim_input] expected_cc_size = ntuple(i -> 2 * dim_input[i], length(dim_input)) size(CC2x) == expected_cc_size || throw(DimensionMismatch("CC2x must have size $(expected_cc_size), got $(size(CC2x))")) - CC2x .= zero(eltype(CC2x)) - img1_shift = _fftshift(img1_f) - img2_shift = _fftshift(img2_f) - @views @. CC2x[ranges...] = img1_shift * conj(img2_shift) + _embed_crosspower_2x!(CC2x, img1_f, img2_f) # compute cross-correlation and locate the peak - copyto!(CC2x, _ifftshift(CC2x)) _ifft!(CC2x) loc = _findmax_abs2_loc(CC2x, cc2x_abs2_work) diff --git a/test/unit_tests.jl b/test/unit_tests.jl index f8e0b57..76bc75a 100644 --- a/test/unit_tests.jl +++ b/test/unit_tests.jl @@ -66,4 +66,27 @@ using Test @test ret2 === phase_shifted @test phase_shifted ≈ moved_f atol = 1f-6 end + + @testset "2x cross-power embedding matches shift pipeline" begin + for (mx, my) in ((6, 4), (5, 7)) + a = rand(rng, Float32, mx, my) + b = rand(rng, Float32, mx, my) + a_f = fft(a) + b_f = fft(b) + + cc_new = zeros(ComplexF32, 2 * mx, 2 * my) + cc_ref = similar(cc_new) + + FFTRegGPU._embed_crosspower_2x!(cc_new, a_f, b_f) + + ranges = [(x + 1 - div(x, 2)):(x + 1 + div(x - 1, 2)) for x in size(a_f)] + cc_ref .= 0 + a_shift = FFTRegGPU._fftshift(a_f) + b_shift = FFTRegGPU._fftshift(b_f) + @views @. cc_ref[ranges...] = a_shift * conj(b_shift) + copyto!(cc_ref, FFTRegGPU._ifftshift(cc_ref)) + + @test cc_new == cc_ref + end + end end From a8b010b53cf9a7ae4b41755bd93bbbbe06f7cc85 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:45:59 +0000 Subject: [PATCH 36/40] Added CUDA-specialized _findmax_abs2_loc overrides --- ext/FFTRegGPUCUDAExt.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 6e3aef8..09a9ba3 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -13,6 +13,7 @@ using CUDA import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at import FFTRegGPU: _plan_fft_inplace, _fft_inplace! +import FFTRegGPU: _findmax_abs2_loc _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) @@ -24,11 +25,16 @@ _fft_inplace!(inp::CUDA.CuArray{<:Complex}, plan) = (plan * inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] +_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = findmax(abs2, inp)[2] _fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) _ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) _fftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, idx) = CUDA.@allowscalar inp[idx] +_findmax_abs2_loc( + inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, + ::Union{Nothing,AbstractArray{<:Real}}=nothing, +) = findmax(abs2, inp)[2] end From 0c858a3bb78902e79e730a8d1a02ead94d6758fe Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:50:49 +0000 Subject: [PATCH 37/40] Add CUDA map-reduce argmax to avoid typemin error on complex types --- ext/FFTRegGPUCUDAExt.jl | 42 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 09a9ba3..a25458f 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -15,6 +15,43 @@ import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at import FFTRegGPU: _plan_fft_inplace, _fft_inplace! import FFTRegGPU: _findmax_abs2_loc +struct _EachIndex{T,N,IS} <: AbstractArray{T,N} + dims::NTuple{N,Int} + indices::IS +end +_EachIndex(A::AbstractArray) = + _EachIndex{typeof(firstindex(A)), ndims(A), typeof(eachindex(A))}(size(A), eachindex(A)) +Base.size(ei::_EachIndex) = ei.dims +Base.getindex(ei::_EachIndex, i::Int) = ei.indices[i] +Base.IndexStyle(::Type{<:_EachIndex}) = Base.IndexLinear() + +function _findmax_abs2_loc_cuda(inp::AbstractArray{<:Complex}) + isempty(inp) && throw(ArgumentError("input must be non-empty")) + indices = _EachIndex(inp) + dummy_index = firstindex(inp) + Treal = float(real(eltype(inp))) + + function reduction(t1, t2) + (x, i), (y, j) = t1, t2 + if isless(x, y) + return t2 + elseif isequal(x, y) + return (x, min(i, j)) + else + return t1 + end + end + + res = mapreduce( + (x, i) -> (abs2(x), i), + reduction, + inp, + indices; + init=(typemin(Treal), dummy_index), + ) + ndims(inp) == 1 ? res[2] : CartesianIndices(inp)[res[2]] +end + _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) _ifft!(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.ifft!(inp) @@ -25,7 +62,8 @@ _fft_inplace!(inp::CUDA.CuArray{<:Complex}, plan) = (plan * inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] -_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = findmax(abs2, inp)[2] +_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = + _findmax_abs2_loc_cuda(inp) _fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) _ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) @@ -35,6 +73,6 @@ _scalar_at(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, idx) = CUDA.@allowscalar i _findmax_abs2_loc( inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, ::Union{Nothing,AbstractArray{<:Real}}=nothing, -) = findmax(abs2, inp)[2] +) = _findmax_abs2_loc_cuda(inp) end From 23c86ebe0d8ff6c1415756541a6a6585c871f454 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:54:25 +0000 Subject: [PATCH 38/40] Revert "Add CUDA map-reduce argmax to avoid typemin error on complex types" This reverts commit 0c858a3bb78902e79e730a8d1a02ead94d6758fe. --- ext/FFTRegGPUCUDAExt.jl | 42 ++--------------------------------------- 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index a25458f..09a9ba3 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -15,43 +15,6 @@ import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at import FFTRegGPU: _plan_fft_inplace, _fft_inplace! import FFTRegGPU: _findmax_abs2_loc -struct _EachIndex{T,N,IS} <: AbstractArray{T,N} - dims::NTuple{N,Int} - indices::IS -end -_EachIndex(A::AbstractArray) = - _EachIndex{typeof(firstindex(A)), ndims(A), typeof(eachindex(A))}(size(A), eachindex(A)) -Base.size(ei::_EachIndex) = ei.dims -Base.getindex(ei::_EachIndex, i::Int) = ei.indices[i] -Base.IndexStyle(::Type{<:_EachIndex}) = Base.IndexLinear() - -function _findmax_abs2_loc_cuda(inp::AbstractArray{<:Complex}) - isempty(inp) && throw(ArgumentError("input must be non-empty")) - indices = _EachIndex(inp) - dummy_index = firstindex(inp) - Treal = float(real(eltype(inp))) - - function reduction(t1, t2) - (x, i), (y, j) = t1, t2 - if isless(x, y) - return t2 - elseif isequal(x, y) - return (x, min(i, j)) - else - return t1 - end - end - - res = mapreduce( - (x, i) -> (abs2(x), i), - reduction, - inp, - indices; - init=(typemin(Treal), dummy_index), - ) - ndims(inp) == 1 ? res[2] : CartesianIndices(inp)[res[2]] -end - _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) _ifft!(inp::CUDA.CuArray{<:Complex}) = CUDA.CUFFT.ifft!(inp) @@ -62,8 +25,7 @@ _fft_inplace!(inp::CUDA.CuArray{<:Complex}, plan) = (plan * inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] -_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = - _findmax_abs2_loc_cuda(inp) +_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = findmax(abs2, inp)[2] _fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) _ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) @@ -73,6 +35,6 @@ _scalar_at(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, idx) = CUDA.@allowscalar i _findmax_abs2_loc( inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, ::Union{Nothing,AbstractArray{<:Real}}=nothing, -) = _findmax_abs2_loc_cuda(inp) +) = findmax(abs2, inp)[2] end From 497f51297da40ff58cb6cb6fc61f43f493d72d74 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 21:54:25 +0000 Subject: [PATCH 39/40] Revert "Added CUDA-specialized _findmax_abs2_loc overrides" This reverts commit a8b010b53cf9a7ae4b41755bd93bbbbe06f7cc85. --- ext/FFTRegGPUCUDAExt.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ext/FFTRegGPUCUDAExt.jl b/ext/FFTRegGPUCUDAExt.jl index 09a9ba3..6e3aef8 100644 --- a/ext/FFTRegGPUCUDAExt.jl +++ b/ext/FFTRegGPUCUDAExt.jl @@ -13,7 +13,6 @@ using CUDA import FFTRegGPU: _fft, _ifft, _ifft!, _fftshift, _ifftshift, _scalar_at import FFTRegGPU: _plan_fft_inplace, _fft_inplace! -import FFTRegGPU: _findmax_abs2_loc _fft(inp::CUDA.CuArray) = CUDA.CUFFT.fft(inp) _ifft(inp::CUDA.CuArray) = CUDA.CUFFT.ifft(inp) @@ -25,16 +24,11 @@ _fft_inplace!(inp::CUDA.CuArray{<:Complex}, plan) = (plan * inp) _fftshift(inp::CUDA.CuArray) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::CUDA.CuArray) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::CUDA.CuArray, idx) = CUDA.@allowscalar inp[idx] -_findmax_abs2_loc(inp::CUDA.CuArray{<:Complex}, ::Union{Nothing,AbstractArray{<:Real}}=nothing) = findmax(abs2, inp)[2] _fft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fft(inp) _ifft(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifft(inp) _fftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.fftshift(inp) _ifftshift(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}) = CUDA.CUFFT.ifftshift(inp) _scalar_at(inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, idx) = CUDA.@allowscalar inp[idx] -_findmax_abs2_loc( - inp::SubArray{<:Any,<:Any,<:CUDA.CuArray}, - ::Union{Nothing,AbstractArray{<:Real}}=nothing, -) = findmax(abs2, inp)[2] end From ca9d2a50adb028ede54fde7d8aaab31b09e5f2e4 Mon Sep 17 00:00:00 2001 From: urlicht Date: Fri, 13 Mar 2026 22:03:32 +0000 Subject: [PATCH 40/40] Update benchmark --- README.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index e1a0202..4264fd4 100644 --- a/README.md +++ b/README.md @@ -172,30 +172,30 @@ Time in ms | backend | case | dims | median | mean | min | memory | allocs | | :--- | :--- | :--- | ---: | ---: | ---: | ---: | ---: | -| cpu | dftreg | 64x64 | 0.059 | 0.066 | 0.059 | 400 | 7 | -| cpu | dftreg_subpix | 64x64 | 0.403 | 0.419 | 0.400 | 492568 | 263 | -| cpu | dftreg | 128x128 | 0.203 | 0.214 | 0.202 | 400 | 7 | -| cpu | dftreg_subpix | 128x128 | 4.515 | 4.310 | 3.885 | 1755864 | 263 | -| cpu | dftreg | 256x256 | 2.944 | 2.951 | 2.912 | 400 | 7 | -| cpu | dftreg_subpix | 256x256 | 96.249 | 86.929 | 19.879 | 6640136 | 285 | -| cpu | dftreg | 512x512 | 17.250 | 17.164 | 15.607 | 400 | 7 | -| cpu | dftreg_subpix | 512x512 | 202.291 | 194.513 | 76.812 | 25846040 | 295 | -| cpu | dftreg | 2048x2048 | 282.298 | 283.155 | 278.946 | 400 | 7 | -| cpu | dftreg_subpix | 2048x2048 | 3731.667 | 3731.667 | 3575.166 | 405360272 | 295 | -| cpu | reg_stack_translate | 128x128x128 | 584.774 | 590.850 | 582.729 | 224239024 | 38492 | -| cpu | reg_stack_translate | 256x256x256 | 29150.903 | 29150.903 | 29150.903 | 1697874352 | 83396 | -| cuda | dftreg | 64x64 | 0.613 | 0.631 | 0.577 | 15120 | 488 | -| cuda | dftreg_subpix | 64x64 | 1.487 | 1.487 | 1.084 | 128000 | 2406 | -| cuda | dftreg | 128x128 | 0.219 | 0.240 | 0.216 | 15088 | 476 | -| cuda | dftreg_subpix | 128x128 | 1.560 | 1.575 | 1.077 | 176576 | 2406 | -| cuda | dftreg | 256x256 | 0.220 | 0.241 | 0.216 | 14976 | 481 | -| cuda | dftreg_subpix | 256x256 | 1.631 | 1.659 | 1.203 | 273152 | 2434 | -| cuda | dftreg | 512x512 | 0.223 | 0.241 | 0.217 | 15264 | 499 | -| cuda | dftreg_subpix | 512x512 | 2.090 | 2.034 | 1.396 | 467408 | 2575 | -| cuda | dftreg | 2048x2048 | 1.845 | 1.853 | 1.619 | 24432 | 1028 | -| cuda | dftreg_subpix | 2048x2048 | 13.527 | 13.277 | 12.191 | 1632336 | 3147 | -| cuda | reg_stack_translate | 128x128x128 | 198.666 | 228.952 | 182.387 | 25326976 | 369055 | -| cuda | reg_stack_translate | 256x256x256 | 410.275 | 413.359 | 394.183 | 76830816 | 751483 | +| cpu | dftreg | 64x64 | 0.060 | 0.066 | 0.059 | 400 | 7 | +| cpu | dftreg_subpix | 64x64 | 0.410 | 0.408 | 0.306 | 295408 | 247 | +| cpu | dftreg | 128x128 | 0.204 | 0.214 | 0.203 | 400 | 7 | +| cpu | dftreg_subpix | 128x128 | 3.687 | 3.661 | 3.331 | 968880 | 247 | +| cpu | dftreg | 256x256 | 2.970 | 2.978 | 2.960 | 400 | 7 | +| cpu | dftreg_subpix | 256x256 | 99.947 | 89.491 | 18.744 | 3493856 | 269 | +| cpu | dftreg | 512x512 | 17.416 | 17.440 | 17.333 | 400 | 7 | +| cpu | dftreg_subpix | 512x512 | 196.452 | 190.043 | 69.564 | 13262576 | 279 | +| cpu | dftreg | 2048x2048 | 258.009 | 258.358 | 256.690 | 400 | 7 | +| cpu | dftreg_subpix | 2048x2048 | 1790.361 | 1768.056 | 1710.282 | 204021056 | 279 | +| cpu | reg_stack_translate | 128x128x128 | 498.022 | 503.165 | 493.216 | 124292056 | 36460 | +| cpu | reg_stack_translate | 256x256x256 | 28044.507 | 28044.507 | 28044.507 | 895572952 | 79316 | +| cuda | dftreg | 64x64 | 0.683 | 0.760 | 0.586 | 15104 | 487 | +| cuda | dftreg_subpix | 64x64 | 1.412 | 1.409 | 0.986 | 118320 | 2051 | +| cuda | dftreg | 128x128 | 0.215 | 0.235 | 0.211 | 15008 | 474 | +| cuda | dftreg_subpix | 128x128 | 1.439 | 1.457 | 1.081 | 166896 | 2051 | +| cuda | dftreg | 256x256 | 0.220 | 0.241 | 0.215 | 15072 | 483 | +| cuda | dftreg_subpix | 256x256 | 1.495 | 1.510 | 1.065 | 263472 | 2076 | +| cuda | dftreg | 512x512 | 0.232 | 0.255 | 0.228 | 15152 | 492 | +| cuda | dftreg_subpix | 512x512 | 1.927 | 3.169 | 1.334 | 457184 | 2186 | +| cuda | dftreg | 2048x2048 | 1.845 | 1.849 | 1.589 | 24432 | 1028 | +| cuda | dftreg_subpix | 2048x2048 | 11.011 | 10.937 | 9.759 | 1622016 | 2752 | +| cuda | reg_stack_translate | 128x128x128 | 182.471 | 212.267 | 165.538 | 24102736 | 324324 | +| cuda | reg_stack_translate | 256x256x256 | 382.678 | 389.114 | 370.962 | 74343728 | 659790 | ### Configuration ```