cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: FFTW 3.3.8: Using Plans cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: cannam@167:
cannam@167:

cannam@167: Next: , Previous: , Up: FFTW Reference   [Contents][Index]

cannam@167:
cannam@167:
cannam@167: cannam@167:

4.2 Using Plans

cannam@167: cannam@167:

Plans for all transform types in FFTW are stored as type cannam@167: fftw_plan (an opaque pointer type), and are created by one of the cannam@167: various planning routines described in the following sections. cannam@167: cannam@167: An fftw_plan contains all information necessary to compute the cannam@167: transform, including the pointers to the input and output arrays. cannam@167:

cannam@167:
cannam@167:
void fftw_execute(const fftw_plan plan);
cannam@167: 
cannam@167: cannam@167: cannam@167:

This executes the plan, to compute the corresponding transform on cannam@167: the arrays for which it was planned (which must still exist). The plan cannam@167: is not modified, and fftw_execute can be called as many times as cannam@167: desired. cannam@167:

cannam@167:

To apply a given plan to a different array, you can use the new-array execute cannam@167: interface. See New-array Execute Functions. cannam@167:

cannam@167:

fftw_execute (and equivalents) is the only function in FFTW cannam@167: guaranteed to be thread-safe; see Thread safety. cannam@167:

cannam@167:

This function: cannam@167:

cannam@167:
void fftw_destroy_plan(fftw_plan plan);
cannam@167: 
cannam@167: cannam@167:

deallocates the plan and all its associated data. cannam@167:

cannam@167:

FFTW’s planner saves some other persistent data, such as the cannam@167: accumulated wisdom and a list of algorithms available in the current cannam@167: configuration. If you want to deallocate all of that and reset FFTW cannam@167: to the pristine state it was in when you started your program, you can cannam@167: call: cannam@167:

cannam@167:
cannam@167:
void fftw_cleanup(void);
cannam@167: 
cannam@167: cannam@167: cannam@167:

After calling fftw_cleanup, all existing plans become undefined, cannam@167: and you should not attempt to execute them nor to destroy them. You can cannam@167: however create and execute/destroy new plans, in which case FFTW starts cannam@167: accumulating wisdom information again. cannam@167:

cannam@167:

fftw_cleanup does not deallocate your plans, however. To prevent cannam@167: memory leaks, you must still call fftw_destroy_plan before cannam@167: executing fftw_cleanup. cannam@167:

cannam@167:

Occasionally, it may useful to know FFTW’s internal “cost” metric cannam@167: that it uses to compare plans to one another; this cost is cannam@167: proportional to an execution time of the plan, in undocumented units, cannam@167: if the plan was created with the FFTW_MEASURE or other cannam@167: timing-based options, or alternatively is a heuristic cost function cannam@167: for FFTW_ESTIMATE plans. (The cost values of measured and cannam@167: estimated plans are not comparable, being in different units. Also, cannam@167: costs from different FFTW versions or the same version compiled cannam@167: differently may not be in the same units. Plans created from wisdom cannam@167: have a cost of 0 since no timing measurement is performed for them. cannam@167: Finally, certain problems for which only one top-level algorithm was cannam@167: possible may have required no measurements of the cost of the whole cannam@167: plan, in which case fftw_cost will also return 0.) The cost cannam@167: metric for a given plan is returned by: cannam@167:

cannam@167:
cannam@167:
double fftw_cost(const fftw_plan plan);
cannam@167: 
cannam@167: cannam@167: cannam@167:

The following two routines are provided purely for academic purposes cannam@167: (that is, for entertainment). cannam@167:

cannam@167:
cannam@167:
void fftw_flops(const fftw_plan plan, 
cannam@167:                 double *add, double *mul, double *fma);
cannam@167: 
cannam@167: cannam@167: cannam@167:

Given a plan, set add, mul, and fma to an cannam@167: exact count of the number of floating-point additions, multiplications, cannam@167: and fused multiply-add operations involved in the plan’s execution. The cannam@167: total number of floating-point operations (flops) is add + mul + cannam@167: 2*fma, or add + mul + fma if the hardware supports fused cannam@167: multiply-add instructions (although the number of FMA operations is only cannam@167: approximate because of compiler voodoo). (The number of operations cannam@167: should be an integer, but we use double to avoid overflowing cannam@167: int for large transforms; the arguments are of type double cannam@167: even for single and long-double precision versions of FFTW.) cannam@167:

cannam@167:
cannam@167:
void fftw_fprint_plan(const fftw_plan plan, FILE *output_file);
cannam@167: void fftw_print_plan(const fftw_plan plan);
cannam@167: char *fftw_sprint_plan(const fftw_plan plan);
cannam@167: 
cannam@167: cannam@167: cannam@167: cannam@167:

This outputs a “nerd-readable” representation of the plan to cannam@167: the given file, to stdout, or two a newly allocated cannam@167: NUL-terminated string (which the caller is responsible for deallocating cannam@167: with free), respectively. cannam@167:

cannam@167:
cannam@167:
cannam@167:

cannam@167: Next: , Previous: , Up: FFTW Reference   [Contents][Index]

cannam@167:
cannam@167: cannam@167: cannam@167: cannam@167: cannam@167: