问题标签 [cufft]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
77 浏览

cuda - 如何计算 GFLOP 中 cuFFT 的吞吐量

我想使用 cuFFT 计算 FFT 和 IFFT 的吞吐量。我认为它应该是 O(B n log n),其中 n 是信号长度,B 是批量大小。GFLOP 中的吞吐量应该是 = 10^-9 * B * N * log N * c / runtime。
问题是如何找出 c (这里的常数)。我发现有些人在 FFT 的情况下使用 c = 2.5,在 IFFT 的情况下使用 c = 5。这个对吗?

0 投票
1 回答
99 浏览

opengl - 将 cuFFT 应用于 OpenGL 顶点缓冲区对象

因此,该cufftComplex类型是一个数组,其n结构具有一个x和一个y字段,分别表示每个复数的实部和虚部。

另一方面,如果我想在 OpenGL 中创建一个带有x-andy-字段的顶点缓冲区对象,即一个 2D 顶点或只是一个也表示n复数的顶点缓冲区对象,我将不得不创建一个2n具有布局的浮点数组像这样:

然后我通过调用将其写入 VBO:

我想用 cuFFT 对图像进行傅里叶变换,并显示例如复数值的大小。如何解决这两种数据类型之间的不兼容问题?cuFFT 有没有办法对 VBO 采取行动?

编辑:

也许我应该编写一个 CUDA 内核,它采用 cufftComplex 类型并将每个复数的大小映射到 1D-VBO。或将 cufftComplex 类型映射到 2D-VBO 的 CUDA 内核。我不知道开销是多少,因为它是设备-> 设备,我希望它是可管理的。

0 投票
0 回答
173 浏览

python - 如何修复使用 skcuda.cufft 的 fft 函数中的参数错误?

我想制作一个 python 包装的 GPU fft 函数,可以使用 scikits-cuda.cufft 计算任意大小的输入的变换。(我尝试了 PyFFT,它只需要 2 的幂)

我从 CUDA 代码建模了我的 skcuda.cufft 代码:

我的 skcuda.cufft 代码如下所示:

但它给出了错误:

runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli') Traceback(最近一次调用最后):

文件“”,第 1 行,在 runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli')

文件“/home/jesli/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py”,第 580 行,运行文件 execfile(文件名,命名空间)

文件“/home/jesli/sk-cufft_test.py”,第 19 行,在 ft.cufftExecZ2Z(plan,x_gpu,xf_gpu,ft.CUFFT_FORWARD)

文件“/home/jesli/anaconda/lib/python2.7/site-packages/skcuda/cufft.py”,第 319 行,cufftExecZ2Z 方向)

ArgumentError:参数 2::错误类型

变换方向(CUFFT_FORWARDCUFFT_INVERSE)已在源代码中定义。

http://scikit-cuda.readthedocs.org/en/latest/_modules/skcuda/cufft.html

我想知道代码出了什么问题,或者函数需要什么参数。

0 投票
1 回答
520 浏览

c - 并发流中的 CUDA cuFFT API 行为

我正在使用带有 nVidia 980 GTX 的 CUDA 7.0 进行一些图像处理。在特定的迭代中,通过 15-20 个内核调用和多个 cuFFT FFT/IFFT API 调用独立处理多个切片。

正因为如此,我将每个图块放在它自己的 CUDA 流中,因此每个图块相对于主机异步执行它的操作字符串。每个图块在迭代中的大小相同,因此它们共享一个 cuFFT 计划。主机线程在命令中快速移动,试图让 GPU 保持工作负载。虽然这些操作正在并行处理,但我遇到了周期性的竞争条件,并且特别对 cuFFT 有疑问。如果我使用 cuFFTSetStream() 将 cuFFT 计划放在流 0 中用于 tile 0,并且在主机将共享 cuFFT 计划的流设置为 tile 1 的流 1 之前,还没有在 GPU 上实际执行 tile 0 的 FFT它在 GPU 上发布 tile 1 的工作,该计划的 cuFFTExec() 的行为是什么?

更简洁地说,对 cufftExec() 的调用是否会在调用 cufftExec() 时计划设置的流中执行,无论是否使用 cuFFTSetStream() 在实际开始之前的 FFT 调用之前更改后续图块的流/完全的?

我很抱歉没有发布代码,但我无法发布我的实际来源。

0 投票
1 回答
466 浏览

image - 策略 - CUFFT 在许多图像上计算 2D FFT

我在 128 张图像上使用 CUFFT 进行 2D FFT。每个图像的大小为 128 x 128。在 MATLAB 上,执行一次 2D FFT 需要 0.3 毫秒,而对所有 128 幅图像执行 FFT 几乎是该毫秒数的 128 倍。使用 CUFFT,以下代码的执行计算一张图像的 FFT

在我的机器上大约需要 0.4 毫秒。

我尝试对不止一张图片执行相同的代码,执行时间基本上是图片数量的0.4ms的倍数。我这样做的方式基本上是多次复制和粘贴上面的代码,当然,为相应的图像更改了变量,这意味着

所以我可以预期,如果我对所有 128 个图像应用 2D FFT,执行时间将与 MATLAB 的执行时间几乎相同。

所以我的问题是:我应用执行的方式是否正确?我是否充分利用了 GPU 的并行计算能力?我是否应该修改执行代码的方式,例如,首先对所有 128 个图像执行 cudaMemcpy 并执行它们,以便重叠一些 CPU 和 GPU 执行?

0 投票
1 回答
523 浏览

cuda - CUDA 袖口库 2D FFT 仅左半平面正确

我正在使用 CUFFT 库对 128 个大小为 128 x 128 的图像进行 2D FFT。我使用该库的方式如下:

主机上的输入 in_real 是一个包含 3D 图像的大数组,它是一个双数组。我想从/到cufftDoubleReal和从/到cufftDoubleComplex的复数转换应该没有问题?我对计划的制定方式和参数有点怀疑,我试图在网上找到一些例子,但它们没有那么有用,也没有那么一致。然后我只是根据自己的理解通过编程指南设置参数。

如标题所示,输出部分正确(左半平面),右半平面为零,这让我很困惑。我尝试设置不同类型的兼容模式,但没有太大帮助。我比较的版本是 MATLAB fft2()。

0 投票
1 回答
88 浏览

c++ - CUDA FFT 没有返回我期望的值

我目前正在调试我的代码,我在其中使用 CUDA FFT 例程。

我有这样的事情(请参阅评论,了解我对我所做工作的看法):

所以我现在遇到的问题是,outDbl 中的结果不是我期望的那样。例如,如果我在这个函数中给出以下值:

真实 = [0 -5.567702511594111 -5.595068807897317 -5.595068807897317 -5.567702511594111]

图像 = [0 9.678604224870535 2.280007038673738 -2.280007038673738 -9.678604224870535]

我希望得到:

结果 = [-4.46511 -3.09563 -0.29805 2.51837 5.34042]

但我得到了完全不同的东西。

我做错了什么?我误解了 FFT 函数吗?基本上不是从复数到实数的逆FFT吗?我的数据复制例程有问题吗?

我必须承认我对这个有点迷茫。

0 投票
1 回答
601 浏览

c++ - cuFFT 流的并发性

所以我将 cuFFT 与 CUDA 流功能结合使用。我遇到的问题是我似乎无法让 cuFFT 内核完全并发运行。以下是我从 nvvp 得到的结果。每个流都在 128 个大小为 128x128 的图像上运行 2D 批量 FFT 内核。我设置了 3 个流来运行 3 个独立的 FFT 批处理计划。

在此处输入图像描述

从图中可以看出,一些内存副本(黄色条)与一些内核计算(紫色、棕色和粉色条)同时进行。但是内核运行根本不是并发的。正如您所注意到的,每个内核都严格遵循彼此。以下是我用于将内存复制到设备和内核启动的代码。

然后我更改了我的代码,以便我完成所有内存副本(同步)并将所有内核一次发送到流,我得到了以下分析结果:

在此处输入图像描述

然后我被确认内核没有以并发方式运行。

我查看了一个链接,该链接详细解释了如何通过在#include 或代码中传递“–default-stream per-thread”命令行参数或#define CUDA_API_PER_THREAD_DEFAULT_STREAM 来设置利用完全并发。这是 CUDA 7 中引入的一个功能。我在我的 MacBook Pro Retina 15' 上使用 GeForce GT750M(与上面链接中使用的机器相同)运行了上面链接中的示例代码,并且我能够获得并发内核运行。但是我无法让我的 cuFFT 内核并行运行。

然后我发现这个链接有人说 cuFFT 内核将占用整个 GPU,因此没有两个 cuFFT 内核并行运行。然后我被卡住了。因为我没有找到任何正式的文档来说明 CUFFT 是否启用并发内核。这是真的吗?有没有办法解决这个问题?

0 投票
2 回答
330 浏览

c++ - 袖带设定频率?

我正在使用 CUDA 的 Cufft 处理从水听器接收的数据(每秒 500,000 个整数,频率为 250 赫兹,高通道和低通道)。现在作为 Cufft 工作原理的一个基本示例在这里......

现在我只想知道,如何将 FFT(袖带)的频率设置为 250 赫兹?

谢谢

詹姆士

0 投票
3 回答
8438 浏览

c++ - CUDA 袖带 2D 示例

我目前正在开发一个必须实现 2D-FFT 的程序(用于互相关)。我用 CUDA 做了一个 1D FFT,它给了我正确的结果,我现在正在尝试实现一个 2D 版本。由于网上的示例和文档很少,我发现很难找出错误所在。

到目前为止,我一直只使用 cuFFT 手册。

无论如何,我创建了两个 5x5 数组并用 1 填充它们。我已将它们复制到 GPU 内存并进行了前向 FFT,将它们相乘,然后对结果进行了 ifft。这给了我一个值为 650 的 5x5 阵列。我希望仅在 5x5 阵列的一个插槽中获得值为 25 的 DC 信号。相反,我在整个数组中得到 650。

此外,在将信号复制到 GPU 内存后,我不允许打印信号的值。写作

给我一个访问违规。我在其他 cuda 程序中做过同样的事情,这不是问题。它与复杂变量的工作方式有关,还是人为错误?

如果有人对出了什么问题有任何指示,我将不胜感激。这是代码

上面的代码给出了以下终端输出: