CUDA官方函数库:傅里叶变换(CUFFT)相关库函数介绍

序言:

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:      句柄无效
posted @ 2024-02-25 19:11  yangyang,,,  阅读(1759)  评论(0)    收藏  举报