Chris@82: Chris@82: Chris@82: Chris@82: Chris@82:
Chris@82:Chris@82: Next: Basic Interface, Previous: Data Types and Files, Up: FFTW Reference [Contents][Index]
Chris@82:Plans for all transform types in FFTW are stored as type
Chris@82: fftw_plan
(an opaque pointer type), and are created by one of the
Chris@82: various planning routines described in the following sections.
Chris@82:
Chris@82: An fftw_plan
contains all information necessary to compute the
Chris@82: transform, including the pointers to the input and output arrays.
Chris@82:
void fftw_execute(const fftw_plan plan); Chris@82:
This executes the plan
, to compute the corresponding transform on
Chris@82: the arrays for which it was planned (which must still exist). The plan
Chris@82: is not modified, and fftw_execute
can be called as many times as
Chris@82: desired.
Chris@82:
To apply a given plan to a different array, you can use the new-array execute Chris@82: interface. See New-array Execute Functions. Chris@82:
Chris@82:fftw_execute
(and equivalents) is the only function in FFTW
Chris@82: guaranteed to be thread-safe; see Thread safety.
Chris@82:
This function: Chris@82:
void fftw_destroy_plan(fftw_plan plan); Chris@82:
deallocates the plan
and all its associated data.
Chris@82:
FFTW’s planner saves some other persistent data, such as the Chris@82: accumulated wisdom and a list of algorithms available in the current Chris@82: configuration. If you want to deallocate all of that and reset FFTW Chris@82: to the pristine state it was in when you started your program, you can Chris@82: call: Chris@82:
Chris@82:void fftw_cleanup(void); Chris@82:
After calling fftw_cleanup
, all existing plans become undefined,
Chris@82: and you should not attempt to execute them nor to destroy them. You can
Chris@82: however create and execute/destroy new plans, in which case FFTW starts
Chris@82: accumulating wisdom information again.
Chris@82:
fftw_cleanup
does not deallocate your plans, however. To prevent
Chris@82: memory leaks, you must still call fftw_destroy_plan
before
Chris@82: executing fftw_cleanup
.
Chris@82:
Occasionally, it may useful to know FFTW’s internal “cost” metric
Chris@82: that it uses to compare plans to one another; this cost is
Chris@82: proportional to an execution time of the plan, in undocumented units,
Chris@82: if the plan was created with the FFTW_MEASURE
or other
Chris@82: timing-based options, or alternatively is a heuristic cost function
Chris@82: for FFTW_ESTIMATE
plans. (The cost values of measured and
Chris@82: estimated plans are not comparable, being in different units. Also,
Chris@82: costs from different FFTW versions or the same version compiled
Chris@82: differently may not be in the same units. Plans created from wisdom
Chris@82: have a cost of 0 since no timing measurement is performed for them.
Chris@82: Finally, certain problems for which only one top-level algorithm was
Chris@82: possible may have required no measurements of the cost of the whole
Chris@82: plan, in which case fftw_cost
will also return 0.) The cost
Chris@82: metric for a given plan is returned by:
Chris@82:
double fftw_cost(const fftw_plan plan); Chris@82:
The following two routines are provided purely for academic purposes Chris@82: (that is, for entertainment). Chris@82:
Chris@82:void fftw_flops(const fftw_plan plan, Chris@82: double *add, double *mul, double *fma); Chris@82:
Given a plan
, set add
, mul
, and fma
to an
Chris@82: exact count of the number of floating-point additions, multiplications,
Chris@82: and fused multiply-add operations involved in the plan’s execution. The
Chris@82: total number of floating-point operations (flops) is add + mul +
Chris@82: 2*fma
, or add + mul + fma
if the hardware supports fused
Chris@82: multiply-add instructions (although the number of FMA operations is only
Chris@82: approximate because of compiler voodoo). (The number of operations
Chris@82: should be an integer, but we use double
to avoid overflowing
Chris@82: int
for large transforms; the arguments are of type double
Chris@82: even for single and long-double precision versions of FFTW.)
Chris@82:
void fftw_fprint_plan(const fftw_plan plan, FILE *output_file); Chris@82: void fftw_print_plan(const fftw_plan plan); Chris@82: char *fftw_sprint_plan(const fftw_plan plan); Chris@82:
This outputs a “nerd-readable” representation of the plan
to
Chris@82: the given file, to stdout
, or two a newly allocated
Chris@82: NUL-terminated string (which the caller is responsible for deallocating
Chris@82: with free
), respectively.
Chris@82:
Chris@82: Next: Basic Interface, Previous: Data Types and Files, Up: FFTW Reference [Contents][Index]
Chris@82: