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

本文详细介绍了CUFFT库中用于高性能傅里叶变换的函数,包括cufftHandle的管理、cufftPlan1d/cufftPlan2d/cufftPlan3d的创建、以及各种cufftExec函数如C2C、C2R、D2Z等的执行和资源销毁,帮助用户理解和使用这些函数进行信号处理。
摘要由CSDN通过智能技术生成

目录

序言:

FFT句柄

cufftHandle

创建FFT计划

cufftPlan1d()函数

cufftPlan2d()函数

 cufftPlan3d()函数

总结说明

执行FFT变换

cufftExecC2C()函数

cufftExecZ2Z()函数

cufftExecR2C()函数

cufftExecD2Z()函数

cufftExecC2R()函数

cufftExecZ2D()函数

总结说明

销毁FFT句柄

cufftDestroy()函数


序言:

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 相关的任务。下面是它们之间的区别:

  1. 功能:

    • cufftPlanXd() 函数用于创建 FFT 运算的计划(plan),该计划描述了 FFT 运算的参数和配置,包括 FFT 的大小、数据格式、执行方式等。
    • cufftHandle 是一个句柄类型,用于管理 FFT 运算的状态和资源,它可以跟踪 FFT 运算的状态、管理资源等。
  2. 用法:

    • 在进行 FFT 运算之前,首先需要创建一个 FFT 计划,使用 cufftPlanXd() 函数来指定 FFT 的一维参数。
    • 创建 FFT 计划后,可以将其与 cufftHandle 关联,然后使用 cufftHandle 来执行 FFT 运算。
  3. 作用范围:

    • cufftPlanXd() 仅用于创建 FFT 计划,不涉及 FFT 运算的执行和资源管理。
    • cufftHandle 则用于管理 FFT 运算的状态和资源,包括执行 FFT 运算、管理 GPU 资源等。
  4. 资源管理:

    • 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:      句柄无效

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
This document describes CUFFT, the NVIDIA® CUDA™ Fast Fourier Transform (FFT) library. The FFT is a divide-and-conquer algorithm for efficiently computing discrete Fourier transforms of complex or real-valued data sets. It is one of the most important and widely used numerical algorithms in computational physics and general signal processing. The CUFFT library provides a simple interface for computing parallel FFTs on an NVIDIA GPU, which allows users to leverage the floating-point power and parallelism of the GPU without having to develop a custom, CUDA FFT implementation. FFT libraries typically vary in terms of supported transform sizes and data types. For example, some libraries only implement radix-2 FFTs, restricting the transform size to a power of two. The CUFFT Library aims to support a wide range of FFT options efficiently on NVIDIA GPUs. This version of the CUFFT library supports the following features: I Complex and real-valued input and output I 1D, 2D, and 3D transforms I Batch execution for doing multiple transforms of any dimension in parallel I Transform sizes up to 64 million elements in single precision and up to 128 million elements in double precision in any dimension, limited by the available GPU memory I In-place and out-of-place transforms I Double-precision (64-bit floating point) on compatible hardware (sm1.3 and later) I Support for streamed execution, enabling asynchronous computation and data movement I FFTW compatible data layouts I Arbitrary intra- and inter-dimension element strides I Thread-safe API that can be called from multiple independent host threads

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值