@@ -55,8 +55,11 @@ function plan_r2r end
55
55
56
56
# # FFT: Implement fft by calling fftw.
57
57
58
- const version = VersionNumber (split (unsafe_string (cglobal (
59
- (:fftw_version ,libfftw3 ()), UInt8)), [' -' , ' ' ])[2 ])
58
+ # TODO : this is dangerous since it captures runtime data from the compile machine
59
+ # n.b. write this as a function to avoid Julia bugs with the runtime cglobal implementation
60
+ get_version () = VersionNumber (split (unsafe_string (cglobal (
61
+ (:fftw_version ,libfftw3_no_init), UInt8)), [' -' , ' ' ])[2 ])
62
+ const version = get_version ()
60
63
61
64
# # Direction of FFT
62
65
@@ -141,32 +144,32 @@ alignment_of(A::FakeArray) = Int32(0)
141
144
@exclusive function export_wisdom (fname:: AbstractString )
142
145
f = ccall (:fopen , Ptr{Cvoid}, (Cstring,Cstring), fname, :w )
143
146
systemerror (" could not open wisdom file $fname for writing" , f == C_NULL )
144
- ccall ((:fftw_export_wisdom_to_file ,libfftw3 () ), Cvoid, (Ptr{Cvoid},), f)
147
+ ccall ((:fftw_export_wisdom_to_file ,libfftw3), Cvoid, (Ptr{Cvoid},), f)
145
148
ccall (:fputs , Int32, (Ptr{UInt8},Ptr{Cvoid}), " " ^ 256 , f) # no NUL, hence no Cstring
146
- ccall ((:fftwf_export_wisdom_to_file ,libfftw3f () ), Cvoid, (Ptr{Cvoid},), f)
149
+ ccall ((:fftwf_export_wisdom_to_file ,libfftw3f), Cvoid, (Ptr{Cvoid},), f)
147
150
ccall (:fclose , Cvoid, (Ptr{Cvoid},), f)
148
151
end
149
152
150
153
@exclusive function import_wisdom (fname:: AbstractString )
151
154
f = ccall (:fopen , Ptr{Cvoid}, (Cstring,Cstring), fname, :r )
152
155
systemerror (" could not open wisdom file $fname for reading" , f == C_NULL )
153
- if ccall ((:fftw_import_wisdom_from_file ,libfftw3 () ),Int32,(Ptr{Cvoid},),f)== 0 ||
154
- ccall ((:fftwf_import_wisdom_from_file ,libfftw3f () ),Int32,(Ptr{Cvoid},),f)== 0
156
+ if ccall ((:fftw_import_wisdom_from_file ,libfftw3),Int32,(Ptr{Cvoid},),f)== 0 ||
157
+ ccall ((:fftwf_import_wisdom_from_file ,libfftw3f),Int32,(Ptr{Cvoid},),f)== 0
155
158
error (" failed to import wisdom from $fname " )
156
159
end
157
160
ccall (:fclose , Cvoid, (Ptr{Cvoid},), f)
158
161
end
159
162
160
163
@exclusive function import_system_wisdom ()
161
- if ccall ((:fftw_import_system_wisdom ,libfftw3 () ), Int32, ()) == 0 ||
162
- ccall ((:fftwf_import_system_wisdom ,libfftw3f () ), Int32, ()) == 0
164
+ if ccall ((:fftw_import_system_wisdom ,libfftw3), Int32, ()) == 0 ||
165
+ ccall ((:fftwf_import_system_wisdom ,libfftw3f), Int32, ()) == 0
163
166
error (" failed to import system wisdom" )
164
167
end
165
168
end
166
169
167
170
@exclusive function forget_wisdom ()
168
- ccall ((:fftw_forget_wisdom ,libfftw3 () ), Cvoid, ())
169
- ccall ((:fftwf_forget_wisdom ,libfftw3f () ), Cvoid, ())
171
+ ccall ((:fftw_forget_wisdom ,libfftw3), Cvoid, ())
172
+ ccall ((:fftwf_forget_wisdom ,libfftw3f), Cvoid, ())
170
173
end
171
174
172
175
# Threads
@@ -176,15 +179,15 @@ function _set_num_threads(num_threads::Integer)
176
179
@static if fftw_provider == " mkl"
177
180
_last_num_threads[] = num_threads
178
181
end
179
- ccall ((:fftw_plan_with_nthreads ,libfftw3 () ), Cvoid, (Int32,), num_threads)
180
- ccall ((:fftwf_plan_with_nthreads ,libfftw3f () ), Cvoid, (Int32,), num_threads)
182
+ ccall ((:fftw_plan_with_nthreads ,libfftw3), Cvoid, (Int32,), num_threads)
183
+ ccall ((:fftwf_plan_with_nthreads ,libfftw3f), Cvoid, (Int32,), num_threads)
181
184
end
182
185
183
186
@exclusive set_num_threads (num_threads:: Integer ) = _set_num_threads (num_threads)
184
187
185
188
function get_num_threads ()
186
189
@static if fftw_provider == " fftw"
187
- ccall ((:fftw_planner_nthreads ,libfftw3 () ), Cint, ())
190
+ ccall ((:fftw_planner_nthreads ,libfftw3), Cint, ())
188
191
else
189
192
_last_num_threads[]
190
193
end
@@ -211,9 +214,9 @@ const NO_TIMELIMIT = -1.0 # from fftw3.h
211
214
212
215
# only call these when fftwlock is held:
213
216
unsafe_set_timelimit (precision:: fftwTypeDouble ,seconds) =
214
- ccall ((:fftw_set_timelimit ,libfftw3 () ), Cvoid, (Float64,), seconds)
217
+ ccall ((:fftw_set_timelimit ,libfftw3), Cvoid, (Float64,), seconds)
215
218
unsafe_set_timelimit (precision:: fftwTypeSingle ,seconds) =
216
- ccall ((:fftwf_set_timelimit ,libfftw3f () ), Cvoid, (Float64,), seconds)
219
+ ccall ((:fftwf_set_timelimit ,libfftw3f), Cvoid, (Float64,), seconds)
217
220
@exclusive set_timelimit (precision, seconds) = unsafe_set_timelimit (precision, seconds)
218
221
219
222
# Array alignment mod 16:
@@ -234,9 +237,9 @@ unsafe_set_timelimit(precision::fftwTypeSingle,seconds) =
234
237
convert (Int32, convert (Int64, pointer (A)) % 16 )
235
238
else
236
239
alignment_of (A:: StridedArray{T} ) where {T<: fftwDouble } =
237
- ccall ((:fftw_alignment_of , libfftw3 () ), Int32, (Ptr{T},), A)
240
+ ccall ((:fftw_alignment_of , libfftw3), Int32, (Ptr{T},), A)
238
241
alignment_of (A:: StridedArray{T} ) where {T<: fftwSingle } =
239
- ccall ((:fftwf_alignment_of , libfftw3f () ), Int32, (Ptr{T},), A)
242
+ ccall ((:fftwf_alignment_of , libfftw3f), Int32, (Ptr{T},), A)
240
243
end
241
244
242
245
# FFTWPlan (low-level)
@@ -320,9 +323,9 @@ unsafe_convert(::Type{PlanPtr}, p::FFTWPlan) = p.plan
320
323
321
324
# these functions should only be called while the fftwlock is held
322
325
unsafe_destroy_plan (@nospecialize (plan:: FFTWPlan{<:fftwDouble} )) =
323
- ccall ((:fftw_destroy_plan ,libfftw3 () ), Cvoid, (PlanPtr,), plan)
326
+ ccall ((:fftw_destroy_plan ,libfftw3), Cvoid, (PlanPtr,), plan)
324
327
unsafe_destroy_plan (@nospecialize (plan:: FFTWPlan{<:fftwSingle} )) =
325
- ccall ((:fftwf_destroy_plan ,libfftw3f () ), Cvoid, (PlanPtr,), plan)
328
+ ccall ((:fftwf_destroy_plan ,libfftw3f), Cvoid, (PlanPtr,), plan)
326
329
327
330
const deferred_destroy_lock = ReentrantLock () # lock protecting the deferred_destroy_plans list
328
331
const deferred_destroy_plans = FFTWPlan[]
@@ -388,19 +391,19 @@ end
388
391
# ################################################################################################
389
392
390
393
cost (plan:: FFTWPlan{<:fftwDouble} ) =
391
- ccall ((:fftw_cost ,libfftw3 () ), Float64, (PlanPtr,), plan)
394
+ ccall ((:fftw_cost ,libfftw3), Float64, (PlanPtr,), plan)
392
395
cost (plan:: FFTWPlan{<:fftwSingle} ) =
393
- ccall ((:fftwf_cost ,libfftw3f () ), Float64, (PlanPtr,), plan)
396
+ ccall ((:fftwf_cost ,libfftw3f), Float64, (PlanPtr,), plan)
394
397
395
398
@exclusive function arithmetic_ops (plan:: FFTWPlan{<:fftwDouble} )
396
399
add, mul, fma = Ref (0.0 ), Ref (0.0 ), Ref (0.0 )
397
- ccall ((:fftw_flops ,libfftw3 () ), Cvoid,
400
+ ccall ((:fftw_flops ,libfftw3), Cvoid,
398
401
(PlanPtr,Ref{Float64},Ref{Float64},Ref{Float64}), plan, add, mul, fma)
399
402
return (round (Int64, add[]), round (Int64, mul[]), round (Int64, fma[]))
400
403
end
401
404
@exclusive function arithmetic_ops (plan:: FFTWPlan{<:fftwSingle} )
402
405
add, mul, fma = Ref (0.0 ), Ref (0.0 ), Ref (0.0 )
403
- ccall ((:fftwf_flops ,libfftw3f () ), Cvoid,
406
+ ccall ((:fftwf_flops ,libfftw3f), Cvoid,
404
407
(PlanPtr,Ref{Float64},Ref{Float64},Ref{Float64}), plan, add, mul, fma)
405
408
return (round (Int64, add[]), round (Int64, mul[]), round (Int64, fma[]))
406
409
end
@@ -431,9 +434,9 @@ const has_sprint_plan = version >= v"3.3.4" && fftw_provider == "fftw"
431
434
432
435
@static if has_sprint_plan
433
436
sprint_plan_ (plan:: FFTWPlan{<:fftwDouble} ) =
434
- ccall ((:fftw_sprint_plan ,libfftw3 () ), Ptr{UInt8}, (PlanPtr,), plan)
437
+ ccall ((:fftw_sprint_plan ,libfftw3), Ptr{UInt8}, (PlanPtr,), plan)
435
438
sprint_plan_ (plan:: FFTWPlan{<:fftwSingle} ) =
436
- ccall ((:fftwf_sprint_plan ,libfftw3f () ), Ptr{UInt8}, (PlanPtr,), plan)
439
+ ccall ((:fftwf_sprint_plan ,libfftw3f), Ptr{UInt8}, (PlanPtr,), plan)
437
440
function sprint_plan (plan:: FFTWPlan )
438
441
p = sprint_plan_ (plan)
439
442
str = unsafe_string (p)
@@ -515,49 +518,49 @@ _colmajorstrides(p) = ()
515
518
# Execute
516
519
517
520
unsafe_execute! (plan:: FFTWPlan{<:fftwDouble} ) =
518
- ccall ((:fftw_execute ,libfftw3 () ), Cvoid, (PlanPtr,), plan)
521
+ ccall ((:fftw_execute ,libfftw3), Cvoid, (PlanPtr,), plan)
519
522
520
523
unsafe_execute! (plan:: FFTWPlan{<:fftwSingle} ) =
521
- ccall ((:fftwf_execute ,libfftw3f () ), Cvoid, (PlanPtr,), plan)
524
+ ccall ((:fftwf_execute ,libfftw3f), Cvoid, (PlanPtr,), plan)
522
525
523
526
unsafe_execute! (plan:: cFFTWPlan{T} ,
524
527
X:: StridedArray{T} , Y:: StridedArray{T} ) where {T<: fftwDouble } =
525
- ccall ((:fftw_execute_dft ,libfftw3 () ), Cvoid,
528
+ ccall ((:fftw_execute_dft ,libfftw3), Cvoid,
526
529
(PlanPtr,Ptr{T},Ptr{T}), plan, X, Y)
527
530
528
531
unsafe_execute! (plan:: cFFTWPlan{T} ,
529
532
X:: StridedArray{T} , Y:: StridedArray{T} ) where {T<: fftwSingle } =
530
- ccall ((:fftwf_execute_dft ,libfftw3f () ), Cvoid,
533
+ ccall ((:fftwf_execute_dft ,libfftw3f), Cvoid,
531
534
(PlanPtr,Ptr{T},Ptr{T}), plan, X, Y)
532
535
533
536
unsafe_execute! (plan:: rFFTWPlan{Float64,FORWARD} ,
534
537
X:: StridedArray{Float64} , Y:: StridedArray{Complex{Float64}} ) =
535
- ccall ((:fftw_execute_dft_r2c ,libfftw3 () ), Cvoid,
538
+ ccall ((:fftw_execute_dft_r2c ,libfftw3), Cvoid,
536
539
(PlanPtr,Ptr{Float64},Ptr{Complex{Float64}}), plan, X, Y)
537
540
538
541
unsafe_execute! (plan:: rFFTWPlan{Float32,FORWARD} ,
539
542
X:: StridedArray{Float32} , Y:: StridedArray{Complex{Float32}} ) =
540
- ccall ((:fftwf_execute_dft_r2c ,libfftw3f () ), Cvoid,
543
+ ccall ((:fftwf_execute_dft_r2c ,libfftw3f), Cvoid,
541
544
(PlanPtr,Ptr{Float32},Ptr{Complex{Float32}}), plan, X, Y)
542
545
543
546
unsafe_execute! (plan:: rFFTWPlan{Complex{Float64},BACKWARD} ,
544
547
X:: StridedArray{Complex{Float64}} , Y:: StridedArray{Float64} ) =
545
- ccall ((:fftw_execute_dft_c2r ,libfftw3 () ), Cvoid,
548
+ ccall ((:fftw_execute_dft_c2r ,libfftw3), Cvoid,
546
549
(PlanPtr,Ptr{Complex{Float64}},Ptr{Float64}), plan, X, Y)
547
550
548
551
unsafe_execute! (plan:: rFFTWPlan{Complex{Float32},BACKWARD} ,
549
552
X:: StridedArray{Complex{Float32}} , Y:: StridedArray{Float32} ) =
550
- ccall ((:fftwf_execute_dft_c2r ,libfftw3f () ), Cvoid,
553
+ ccall ((:fftwf_execute_dft_c2r ,libfftw3f), Cvoid,
551
554
(PlanPtr,Ptr{Complex{Float32}},Ptr{Float32}), plan, X, Y)
552
555
553
556
unsafe_execute! (plan:: r2rFFTWPlan{T} ,
554
557
X:: StridedArray{T} , Y:: StridedArray{T} ) where {T<: fftwDouble } =
555
- ccall ((:fftw_execute_r2r ,libfftw3 () ), Cvoid,
558
+ ccall ((:fftw_execute_r2r ,libfftw3), Cvoid,
556
559
(PlanPtr,Ptr{T},Ptr{T}), plan, X, Y)
557
560
558
561
unsafe_execute! (plan:: r2rFFTWPlan{T} ,
559
562
X:: StridedArray{T} , Y:: StridedArray{T} ) where {T<: fftwSingle } =
560
- ccall ((:fftwf_execute_r2r ,libfftw3f () ), Cvoid,
563
+ ccall ((:fftwf_execute_r2r ,libfftw3f), Cvoid,
561
564
(PlanPtr,Ptr{T},Ptr{T}), plan, X, Y)
562
565
563
566
# NOTE ON GC (garbage collection):
@@ -654,7 +657,7 @@ for (Tr,Tc,fftw,lib) in ((:Float64,:(Complex{Float64}),"fftw",:libfftw3),
654
657
unsafe_set_timelimit ($ Tr, timelimit)
655
658
R = isa (region, Tuple) ? region : copy (region)
656
659
dims, howmany = dims_howmany (X, Y, size (X), R)
657
- plan = ccall (($ (string (fftw," _plan_guru64_dft" )),$ lib () ),
660
+ plan = ccall (($ (string (fftw," _plan_guru64_dft" )),$ lib),
658
661
PlanPtr,
659
662
(Int32, Ptr{Int}, Int32, Ptr{Int},
660
663
Ptr{$ Tc}, Ptr{$ Tc}, Int32, UInt32),
@@ -674,7 +677,7 @@ for (Tr,Tc,fftw,lib) in ((:Float64,:(Complex{Float64}),"fftw",:libfftw3),
674
677
regionshft = _circshiftmin1 (region) # FFTW halves last dim
675
678
unsafe_set_timelimit ($ Tr, timelimit)
676
679
dims, howmany = dims_howmany (X, Y, size (X), regionshft)
677
- plan = ccall (($ (string (fftw," _plan_guru64_dft_r2c" )),$ lib () ),
680
+ plan = ccall (($ (string (fftw," _plan_guru64_dft_r2c" )),$ lib),
678
681
PlanPtr,
679
682
(Int32, Ptr{Int}, Int32, Ptr{Int},
680
683
Ptr{$ Tr}, Ptr{$ Tc}, UInt32),
@@ -694,7 +697,7 @@ for (Tr,Tc,fftw,lib) in ((:Float64,:(Complex{Float64}),"fftw",:libfftw3),
694
697
regionshft = _circshiftmin1 (region) # FFTW halves last dim
695
698
unsafe_set_timelimit ($ Tr, timelimit)
696
699
dims, howmany = dims_howmany (X, Y, size (Y), regionshft)
697
- plan = ccall (($ (string (fftw," _plan_guru64_dft_c2r" )),$ lib () ),
700
+ plan = ccall (($ (string (fftw," _plan_guru64_dft_c2r" )),$ lib),
698
701
PlanPtr,
699
702
(Int32, Ptr{Int}, Int32, Ptr{Int},
700
703
Ptr{$ Tc}, Ptr{$ Tr}, UInt32),
@@ -716,7 +719,7 @@ for (Tr,Tc,fftw,lib) in ((:Float64,:(Complex{Float64}),"fftw",:libfftw3),
716
719
knd = fix_kinds (region, kinds)
717
720
unsafe_set_timelimit ($ Tr, timelimit)
718
721
dims, howmany = dims_howmany (X, Y, size (X), region)
719
- plan = ccall (($ (string (fftw," _plan_guru64_r2r" )),$ lib () ),
722
+ plan = ccall (($ (string (fftw," _plan_guru64_r2r" )),$ lib),
720
723
PlanPtr,
721
724
(Int32, Ptr{Int}, Int32, Ptr{Int},
722
725
Ptr{$ Tr}, Ptr{$ Tr}, Ptr{Int32}, UInt32),
@@ -744,7 +747,7 @@ for (Tr,Tc,fftw,lib) in ((:Float64,:(Complex{Float64}),"fftw",:libfftw3),
744
747
howmany[2 : 3 , :] .*= 2
745
748
end
746
749
howmany = [howmany [2 ,1 ,1 ]] # append loop over real/imag parts
747
- plan = ccall (($ (string (fftw," _plan_guru64_r2r" )),$ lib () ),
750
+ plan = ccall (($ (string (fftw," _plan_guru64_r2r" )),$ lib),
748
751
PlanPtr,
749
752
(Int32, Ptr{Int}, Int32, Ptr{Int},
750
753
Ptr{$ Tc}, Ptr{$ Tc}, Ptr{Int32}, UInt32),
0 commit comments