目录
序言:
CUFFT函数库的主要作用是实现高性能的傅里叶变换计算, 提供了多种类型的傅里叶变换函数,包括一维、二维和三维的实数和复数傅里叶变换。它支持多种数据布局和数据类型,例如当精度实数和复数,双精度实数和复数等。之前上传了CUFFT库的官方文件(免费下载,请点击),有需要可自行下载。本文主要对常用的库函数做了简要介绍,以备后续使用。
1 FFT句柄
1.1 cufftHandle
功能:
是一个句柄类型,用于管理 FFT 运算的状态和资源,它可以跟踪 FFT 运算的状态、管理资源等。
2 创建FFT计划
主要用于分配和配置FFT操作所需的内存与资源。
2.1 cufftPlan1d()函数
函数:
cufftResult cufftPlan1d(cufftHandle *plan, int nx, cufftType type, int batch)
功能:
为指定的信号大小和数据类型创建1D FFT计划配置
输入参数:
plan:cufftHandle 指针
nx: 用于执行傅里叶变换的数据量大小(在信号处理领域可以视为一段信号的长度)
type:用于执行傅里叶变换的数据类型,比如:CUFFT_C2C,CUFFT_C2R等
batch:用于执行傅里叶变换的量(在信号处理领域可以视为信号的量)
输出参数:
plan:一维傅里叶变换句柄
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
CUFFT_INVALID_SIZE: nx或批处理参数的大小不受支持
2.2 cufftPlan2d()函数
函数:
cufftResult cufftPlan2d(cufftHandle *plan, int nx, int ny, cufftType type)
功能:
根据指定的信号大小和数据类型创建2D FFT计划配置
输入参数:
plan: cufftHandle 指针
nx: 可以视为一个矩阵的列
ny: 可以视为一个矩阵的行
type: 用于执行傅里叶变换的数据类型,比如:CUFFT_C2C,CUFFT_C2R等
输出参数:
plan:二维傅里叶变换句柄
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
CUFFT_INVALID_SIZE: nx或批处理参数的大小不受支持
2.3 cufftPlan3d()函数
函数:
cufftResult cufftPlan3d(cufftHandle *plan, int nx, int ny, int nz, cufftType type)
功能:
根据指定的信号大小和数据类型创建3D FFT计划配置
输入参数:
plan: cufftHandle 指针
nx: 在x方向的数据点数
ny: 在y方向的数据点数
nz: 在z方向的数据点数
type: 用于执行傅里叶变换的数据类型,比如:CUFFT_C2C,CUFFT_C2R等
输出参数:
plan:三维傅里叶变换句柄
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
CUFFT_INVALID_SIZE: nx或批处理参数的大小不受支持
2.4 总结说明
通过上述对cufftHandle和cufftPlanXd()函数的介绍,会误认为这两个的功能是一样的。实际不然,但它们通常一起使用来完成 FFT 相关的任务。下面是它们之间的区别:
功能:
cufftPlanXd()
函数用于创建 FFT 运算的计划(plan),该计划描述了 FFT 运算的参数和配置,包括 FFT 的大小、数据格式、执行方式等。cufftHandle
是一个句柄类型,用于管理 FFT 运算的状态和资源,它可以跟踪 FFT 运算的状态、管理资源等。用法:
- 在进行 FFT 运算之前,首先需要创建一个 FFT 计划,使用
cufftPlanXd()
函数来指定 FFT 的一维参数。- 创建 FFT 计划后,可以将其与
cufftHandle
关联,然后使用cufftHandle
来执行 FFT 运算。作用范围:
cufftPlanXd()
仅用于创建 FFT 计划,不涉及 FFT 运算的执行和资源管理。cufftHandle
则用于管理 FFT 运算的状态和资源,包括执行 FFT 运算、管理 GPU 资源等。资源管理:
cufftPlanXd()
创建的 FFT 计划不涉及资源管理,而是描述 FFT 运算的参数和配置。cufftHandle
用于管理 FFT 运算的资源,包括 GPU 内存和计算资源的分配和释放。
3 执行FFT变换
3.1 cufftExecC2C()函数
函数:
cufftResult cufftExecC2C(cufftHandle plan, cufftComplex *idata, cufftComplex *odata, int direction);
功能:
执行单精度复数到单精度复数的FFT或IFFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的单精度复数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为单精度复数
direction: FFT 的方向,即执行正向变换(从时域到频域)还是逆向变换(从频域到时域)
CUFFT_FORWARD:正向变换,即从时域到频域的变换。
CUFFT_INVERSE:逆向变换,即从频域到时域的变换。
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为单精度复数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.2 cufftExecZ2Z()函数
函数:
cufftResult cufftExecC2C(cufftHandle plan, cufftDoubleComplex*idata, cufftDoubleComplex*odata, int direction);
功能:
执行单精度复数到单精度复数的FFT或IFFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的双精度复数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为双精度复数
direction: FFT 的方向,即执行正向变换(从时域到频域)还是逆向变换(从频域到时域)
CUFFT_FORWARD:正向变换,即从时域到频域的变换。
CUFFT_INVERSE:逆向变换,即从频域到时域的变换。
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为单精度复数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.3 cufftExecR2C()函数
函数:
cufftResult cufftExecR2C(cufftHandle plan, cufftReal*idata, cufftComplex*odata);
功能:
执行单精度复数到单精度复数的FFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的单精度实数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为单精度复数
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为单精度复数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.4 cufftExecD2Z()函数
函数:
cufftResult cufftExecD2Z(cufftHandle plan, cufftDoubleReal*idata, cufftDoubleComplex*odata, int direction);
功能:
执行单精度复数到单精度复数的FFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的双精度实数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为双精度复数
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为双精度复数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.5 cufftExecC2R()函数
函数:
cufftResult cufftExecC2R(cufftHandle plan, cufftComplex*idata, cufftReal*odata);
功能:
执行单精度复数到单精度复数的IFFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的单精度复数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为实数
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为实数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.6 cufftExecZ2D()函数
函数:
cufftResult cufftExecZ2D(cufftHandle plan, cufftDoubleComplex*idata, cufftDoubleReal*odata);
功能:
执行单精度复数到单精度复数的IFFT变换
输入参数:
plan: FFT 计划句柄,用于描述 FFT 的参数和配置。
idata: 输入数据数组的指针,包含待转换的双精度复数序列
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为双精度实数
输出参数:
odata: 输出数据数组的指针,用于存储 FFT 变换的结果,数据格式为双精度实数
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效
CUFFT_ALLOC_FAILED: 为计划分配GPU资源失败
CUFFT_INVALID_VALUE: 向API传递了一个或多个无效参数。
CUFFT_INTERNAL_ERROR: 检测到内部驱动程序错误
CUFFT_SETUP_FAILED: cuFFT库初始化失败
3.7 总结说明
仔细观察可以看出:cufftExecC2C()和cufftExecZ2Z()函数有四个参数,分别代表FFT句柄、输入数组指针、输出数组指针及傅里叶变换(FFT)的方向,而cufftExecR2C()、cufftExecD2Z()、cufftExecC2R()和cufftExecZ2D()函数仅有前三个参数,这是因为cufftExecR2C()和cufftExecD2Z()函数在执行实数到复数的傅里叶变换(FFT)时是单向且固定的,因此没有逆向变换。同理,cufftExecC2R()和cufftExecZ2D()函数在执行复数到实数的逆傅里叶变换(IFFT)时是单向且固定的,因此没有正向变换。相比之下,对于复数到复数的 FFT 变换(例如 cufftExecC2C()和 cufftExecZ2Z函数()),需要区分正向变换(从时域到频域)和逆向变换(从频域到时域),因此需要通过direction参数来指定变换的方向。
4 销毁FFT句柄
4.1 cufftDestroy()函数
函数:
cufftResult cufftDestroy(cufftHandle plan);
功能:
用于销毁FFT计划句柄(handle)并释放相关资源
输入参数:
plan: FFT 计划句柄,即要销毁的FFT计划的句柄。
输出参数:
无
返回值:
CUFFT_SUCCESS: 成功创建FFT计划
CUFFT_INVALID_PLAN: 句柄无效