分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

CUDA为开发人员提供了多种库,每一类库针对某一特定领域的应用,CUFFT库则是CUDA中专门用于进行傅里叶变换的函数库,这一系列的文章是博主近一段时间对cuFFT库的学习总结,主要内容是文档的译文,其间夹杂一些博主自己的理解。初学CUDA,理解有误之处在所难免,阅读本篇文章的读者如若发现请不吝指正。

1. 简介

cuFFT是的全称是CUDA Fast Fourier Transform,顾名思义,它提供了一系列的函数帮助开发者进行快速傅里叶变换的运算。cuFFT库由两个子库构成,它们分别是CUFFT和CUFFTW。CUFFTW库是一个移植工具(porting tool),它为用户提供了一些接口,以使得用户使用FFTW库(一个非常流行的CPU快速傅里叶变换库)编写的程序能够运行在CUDA GPU上。而CUFFT则是纯CUDA接口的快速傅里叶变换库。

在CUDA toolkit 5.5版本中,cuFFT库支持的特性有:

1、对于可以表示为的输入规模,CUFFT会自动采用一些优化算法来达到最佳的运算性能

2、对于所有的输入规模,CUFFT的算法复杂性均为O(nlogn)

3、不同输入输出类型的指定:其中C2C代表输入输出均为复数,R2C代表输入为实数而输出为复数,C2R代表输入为复数而输出为实数。

4、可以进行1维、2维和3维变换

5、多个不同的1D、2D、3D变换可以并行进行

6、同时支持单精度浮点和双精度浮点运算

7、支持就地转换(输出直接覆盖输入)和外部转换(输出和输入不重叠)

8、与FFTW库兼容的数据布局

9、支持跨步输入数据读取

10、支持流执行(Streamed execution),这样就同时支持了计算与数据传输的异步并行执行。

11、对于单精度浮点数,一次最多传输128百万元素,双精度则一次最多传输64百万元素。

12、CUFFT库提供的API是线程安全的。

2. 使用CUFFT API

在关注具体的API之前,我们先来回顾一下快速傅里叶变换的背景知识。
快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的快速算法,在数字信号处理、大整数乘法和求解偏微分方程等领域都有着广泛的应用,DFT的作用是将时域(time domain)上的一组离散复数与到频域(frequency domain)上的一组值相互映射,以对输入数据进行进一步处理。离散傅里叶公式可以表示为:
其中,X k 是与输入数据 x k 大小相同的数组,这一公式也被称作正向(forward)DFT。把上式中e的指数符号修改为正(positive),我们就得到了逆向(inverse)DFT。CUFFT API根据N的不同,将使用不同的优化算法,以达到最佳的性能。
CUFFT API的原型是FFTW库,FFTW则是一个基于CPU的高效FFT库。CUFFT提供了一个简单的被称为plan的配置方法,使用plan的好处是可以根据输入数据的大小预先配置好内存和计算资源,使得真正运算时处理器能达到最佳的性能。设置好plan后,运行execution函数,真正的傅里叶变换便开始执行了。一旦配置完成,配置信息便被保存起来,这对于多次调用来说非常省时。
下面来看一个代码片段,计算BATCH块大小为NX的一维DFT的CUDA代码通常如下所示:

#define NX 256  #define BATCH 10  ... {      cufftHandle plan;      cufftComplex *data;      ...      cudaMalloc((void**)&data, sizeof(cufftComplex)*NX*BATCH);      cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);      ...      cufftExecC2C(plan, data, data, CUFFT_FORWARD);      cudaThreadSynchronize();      ...      cufftDestroy(plan);      cudaFree(data);  }  

2.1. 访问CUFFT(Accessing CUFFT)

CUFFT和CUFFTW均被实现为共享库,可以使用编译器和链接器把它们集成到普通的程序当中。这些库文件和头文件在不同系统上的默认位置如下图所示:

最常见的使用这些库函数的方法是修改一个已经存在的CUDA文件,以filename.cu为例,在filename.cu中将头文件cufft.h包含进来,然后在程序中调用CUFFT库函数,为了使得程序可以运行,一个单一文件的编译和链接命令的形式可以如下:

2.2. 傅里叶变换配置(Fourier Transform Setup)

在CUDA上进行傅里叶变换一般需要做以下几步工作:
1. 创建一个plan。调用函数cufftPlan1D/cufftPlan2D/cufftPlan3D可以分别创建一个简单的1维/2维/3维的傅里叶变换。调用函数cufftPlanMany则可以创建支持更多配置操作的变换计划。
2. 执行plan。这一步可以使用cufftExecC2C()、cufftExecR2C()或cufftExecC2R()等函数完成plan的计算任务。
3. 执行完成以后若不再需要该plan,则调用cufftDestroy()函数销毁该plan及为其分配的计算资源。

2.3 傅里叶变换类型(Fourier Transform Types)

CUFFT库实现了三种不同类型的傅里叶变换:C2C(复数到复数)、C2R(复数到实数)、R2C(实数到复数)。本质上,这三种转换都可以被看做是复数域到复数域的变换,之所以这样划分,其最主要的考量是性能因素。例如,在一般的数字信号处理中,输入数据是一些离散的实数域上的采样点,这时候对它们做傅里叶变换实际上就是R2C,根据埃尔米特对称性(Hermitian symmetry),变换后,*代表共轭复数。CUFFT的傅里叶变换类型则利用了这些冗余,将计算量降到最低。

变换执行函数的单精度和双精度版本分别定义如下:

1. cufftExecC2C() / cufftExecZ2Z() - 单精度/双精度浮点数复数域到复数域的傅里叶变换

2. cufftExecR2C() / cufftExecD2Z() - 单精度/双精度浮点数实数域到复数域的傅里叶变换(正向傅里叶变换)

3. cufftExecC2R() / cufftExecZ2D() - 单精度/双精度浮点数复数域到实数域的傅里叶变换(逆向傅里叶变换)

2.4 数据布局(Data Layout)

CUFFT库包含有若干种数据类型,对于复数有cufftComplex / cufftDoubleComplex两种数据类型,对于实数则分别有cufftReal / cufftDouble两种数据类型。
根据转换结果的存储位置不同,FFT变换可分为就地变换(in-place)和外部变换(out-of-place),前者直接在输入数据上进行变换,而后者则会将变换后的结果存入新的存储器地址。
就地转换(in-place)支持两种数据布局:native和padded,前者用于获得最佳性能,而后者则用于与FFTW库兼容。
在padded布局中输出信号的开始地址与输入信号一样,换句话说,实数域到复数域变换的输入数据和复数域到实数域的输出数据必须被填充。在native布局中则没有填充要求。
输入数据和输出数据的尺寸总结如下:

2.5 流化CUFFT变换(Streamed CUFFT Transform)

CUFFT的每一个plan都可以和某个流(stream)结合起来运行,一旦结合,那么该plan就会在特定的流上面运行。CUFFT执行的流化使得快速傅里叶变换可以和其它流中的数据拷贝任务并行运行,从而提高了设备利用率和程序性能。

2.6 线程安全(Thread Safety)

CUFFT库从版本4.1开始拥有线程安全特性,也就是说,主机端的多个线程同时调用CUFFT中的函数时,CUDA可以保证任务执行的正确性。

http://blog.csdn.net/csgxy123/article/details/10525693

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

CUDA快速傅里叶变换 cuFFT相关推荐

  1. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  2. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  3. 基于python的快速傅里叶变换FFT(二)

    基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点   FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算 ...

  4. 基于python的快速傅里叶变换FFT(一)

    基于python的快速傅里叶变换FFT(一) FFT可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因. ...

  5. 再谈 BigInteger - 使用快速傅里叶变换

    我在"浅谈 BigInteger"的随笔中实现了一个 Skyiv.Numeric.BigInteger 类,那时乘法是使用常规的 O(N2) 的算法,所以比 .NET Framew ...

  6. 使用快速傅里叶变换计算大整数乘法-代码

    在上一篇随笔"使用快速傅里叶变换计算大整数乘法"中,已经讲述了使用快速傅里叶变换计算大整数乘法的原理.在这一篇随笔中,我们就使用快速傅里叶变换来实现一个提供任意精度的算术运算的静态 ...

  7. 【文文殿下】快速傅里叶变换(FFT)学习笔记

    多项式 定义 形如\(A(x)=\sum_{i=0}^{n-1} a_i x^i\)的式子称为多项式. 我们把\(n\)称为该多项式的次数界. 显然,一个\(n-1\)次多项式的次数界为\(n\). ...

  8. 算法导论之多项式与快速傅里叶变换

    在学习本篇之前,有必要理解傅里叶分析相关概念,网上说的比较通俗的参考如下: https://zhuanlan.zhihu.com/p/19763358 要理解正弦和余弦.离散和连续.时域和频域的关系. ...

  9. java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析

    FFT与DFT关系: 快速傅里叶变换(Fast Fourier Transform)是离散傅里叶(DFT)变换的一种快速算法,简称FFT,通过FFT可以将一个信号从时域变换到频域:FFT(快速傅里叶变 ...

最新文章

  1. java 它 引用(基本类型的包装,构造函数和析构函数c++不同)
  2. C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码
  3. python paramiko 问题总结
  4. 手动挡和自动挡该怎么选?哪个起步快、哪个更舒适?
  5. c# winform 打包(带数据库安装)
  6. dorado开发模式下实现动态查询
  7. 《软件项目管理(第二版)》第 4 章——项目估算 重点部分总结
  8. golang生成c-shared so供c语言或者golang调用到例子
  9. 自动优化工具Black帮你写出规范漂亮的python代码
  10. CCF201612试题
  11. Easyui datagrid getData简单使用
  12. 获取本机局域网IP地址
  13. 小智机器人江苏赞_小智伴机器人外观说明
  14. 微信表情符号 mysql_Emoji表情符号入MySQL数据库报错的解决方案
  15. 首席数据官:从哪里来?到哪里去?
  16. 便捷的oh-my-zsh
  17. 核磁共振 Nuclear Magnetic Resonance (NMR), H1-NMR, C13-NMR, DEPT, COSY 等分析技术
  18. JavaScript判断浏览器内核
  19. ORA-00911: invalid character 错误解决
  20. Vue全家桶系列之Vuex(二)

热门文章

  1. 【OpenVINO】OpenVINO 2022.1 安装教程(Windows)
  2. 编码(NRZ、NRZI、曼彻斯特、4B
  3. lseek和文件末尾
  4. 机器学习:浅谈先验概率,后验概率
  5. ARP攻击,使用kali arpspoof
  6. java做机器视觉_机器视觉用什么语言开发_机器视觉用什么硬件
  7. 计算机对人类发展历史的影响,【信息技术对人类社会发展有什么影响?】_人类 发展史_全球新能源网...
  8. 速卖通,aliexpress,关键词搜索,获取商品数据,销量,评价,价格,上架时间,图片,openpyxl 写入excel中
  9. Android Studio 4.1没有GsonFormat插件
  10. FS平台数据库设计规范说明书v1.00