Skip to content

Commit 0f016b9

Browse files
authored
Better handling of (N)FFT operators for different NFFT backends (#264)
* Readd FFT params to NFFTOp constructor * Specialise fft parameter for different AbstractNFFT backend * Fix backend selection module * Test NonuniformFFTs as well * Seperate fft and nfft params * Fix nfftParams for GPU operators * Fix fft params for gpu * Just set fftParams
1 parent 5a0faa5 commit 0f016b9

6 files changed

Lines changed: 21 additions & 6 deletions

File tree

MRIOperators/Project.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "MRIOperators"
22
uuid = "fb1137e3-90a6-46ce-a672-6e1e53d120f2"
33
author = ["Tobias Knopp <tobias@knoppweb.de>"]
4-
version = "0.4.0"
4+
version = "0.4.1"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
@@ -34,16 +34,18 @@ Reexport = "1"
3434
LinearOperators = "2.3"
3535
LinearOperatorCollection = "2"
3636
NFFT = "0.14"
37+
NonuniformFFTs = "0.9"
3738
Wavelets = "0.9, 0.10"
3839
julia = "1.6"
3940

4041
[extras]
42+
NonuniformFFTs = "cd96f58b-6017-4a02-bb9e-f4d81626177f"
4143
JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb"
4244
MRISimulation = "8988da37-ea20-4fa6-9af7-8a6f6f9a8970"
4345
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
4446

4547
[targets]
46-
test = ["Test", "MRISimulation", "JLArrays"]
48+
test = ["Test", "MRISimulation", "JLArrays", "NonuniformFFTs"]
4749

4850
[extensions]
4951
MRIOperatorsGPUArraysExt = ["GPUArrays", "KernelAbstractions"]

MRIOperators/ext/MRIOperatorsGPUArraysExt/MRIOperatorsGPUArraysExt.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ module MRIOperatorsGPUArraysExt
22

33
using MRIOperators, GPUArrays, KernelAbstractions
44
using MRIOperators.FFTW, MRIOperators.LinearAlgebra
5+
using MRIOperators.NFFT
56

67
include("ExplicitOp.jl")
78
include("Shutter.jl")
89
include("SensitivityOp.jl")
910
include("FieldmapNFFTOp.jl")
1011

12+
# Flags for GPUs seem to break dispatch
1113
MRIOperators.fftParams(::Type{<:AbstractGPUArray}) = (;)
12-
14+
MRIOperators.nfftParams(::NFFT.NFFTBackend, ::Type{<:AbstractGPUArray}) = (;)
1315

1416
end # module

MRIOperators/src/EncodingOp.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ function fourierEncodingOp(shape::NTuple{D,Int64}, tr::Trajectory{T}, opName::St
164164
ftOp = SamplingOp(Complex{T}; pattern=idx, shape, S = S) FFTOp(Complex{T}; shape, unitary=false, S = S, fftParams(S)...)
165165
end
166166
else
167-
ftOp = NFFTOp(Complex{T}; nodes = kspaceNodes(tr), shape, S = S, kargs...)
167+
ftOp = NFFTOp(Complex{T}; nodes = kspaceNodes(tr), shape, S = S, nfftParams(S)..., kargs...)
168168
end
169169
else
170170
@error "opName $(opName) is not known"

MRIOperators/src/MRIOperators.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,10 @@ function Base.copy(S::LinearOperator{T}) where T
8383
deepcopy(S)
8484
end
8585

86-
fftParams(::Type{<:AbstractArray}) = (;:flags => FFTW.MEASURE)
86+
fftParams(T::Type{<:AbstractArray}) = (;:flags => FFTW.MEASURE)
87+
nfftParams(T::Type{<:AbstractArray}) = nfftParams(AbstractNFFTs.active_backend(), T)
88+
nfftParams(::AbstractNFFTBackend, ::Type{<:AbstractArray}) = (;:fftflags => FFTW.MEASURE)
89+
8790

8891
# https://github.com/JuliaLang/julia/issues/35543
8992
stripParameters(arrT::Type{<:AbstractArray}) = Base.typename(arrT).wrapper

MRIOperators/test/runtests.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Test, MRIBase, MRIOperators, MRISimulation, MRIOperators.NFFT, MRIOperators.NFFT.FFTW
2+
using NonuniformFFTs
23
using LinearAlgebra, MRIOperators.LinearOperatorCollection
34
using JLArrays
45

@@ -7,5 +8,11 @@ areTypesDefined = @isdefined arrayTypes
78
arrayTypes = areTypesDefined ? arrayTypes : [Array, JLArray]
89

910
@testset "MRIOperators" begin
10-
include("testOperators.jl")
11+
for backend in [NFFT.backend(), NonuniformFFTs.backend()]
12+
with(nfft_backend => backend) do
13+
@testset "Operators with $(string(typeof(backend)))" begin
14+
include("testOperators.jl")
15+
end
16+
end
17+
end
1118
end

src/Reconstruction/RecoParameters.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ volumeSize(reconSize::NTuple{3,Int}, numSlice::Int) = reconSize
181181

182182
executor(::Type{<:AbstractArray}) = nothing
183183
copyOpsFn(::Type{<:AbstractArray}) = copy
184+
# TODO also set nfftParams with new lower bound to MRIOperators 0.4.2
184185
normalOpParams(::Type{aT}) where aT <: AbstractArray = (; :copyOpsFn => copyOpsFn(aT), MRIOperators.fftParams(aT)...)
185186

186187
executor(f::Function) = executor(f{Complex{Float32}}(undef, 0))

0 commit comments

Comments
 (0)