CUDA FFT - 2 的幂

发布于 2024-10-29 22:25:14 字数 108 浏览 4 评论 0原文

我正在查看 CUDA SDK 上的 FFT 示例,我想知道:为什么当填充数据的一半是 2 的幂时,CUFFT 会快得多? (一半是因为在频域中一半是多余的)

使用两倍大小的幂有什么意义?

I'm looking at the FFT example on the CUDA SDK and I'm wondering: why the CUFFT is much faster when the half of the padded data is a power of two? (half because in frequency domain half is redundant)

What's the point in having a power of two size to work on?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

余生共白头 2024-11-05 22:25:14

我想这就是你的答案。它使用不同的算法

http://forums.nvidia.com/index.php?showtopic=195094

“我一直在研究类似的
问题。在cuFFT手册中,它是
解释说 cuFFT 使用两个
不同的算法来实现
FFT。其中之一是库利-塔基
另一个是 Bluestein 方法
算法。当尺寸有
仅 2、3、5 和 7 的质因数,例如
(675 = 3^3 x 5^5),则 675 x 675
性能比 674 好得多
x 674 或 677 x 677。这是使用
库利-塔基方法。如果其中之一
质因数是质因数
大于 2、3、5 或 7,然后对其进行 FFT
数字是使用实现的
布卢斯坦方法。布卢斯坦方法
速度较慢,也有一些
精度损失。 ”

来自手册:http://developer. download.nvidia.com/compute/cuda/3_1/toolkit/docs/CUFFT_Library_3.1.pdf

CUFFT 库实现了多种
FFT 算法,每种算法都有不同的
性能和准确性。最好的
性能路径对应于
变换满足两个的尺寸
标准:

  • 适合 CUDA 共享
    内存
  • 是单因素的幂
    (例如,二的幂)

这些
变换也是最准确的
由于数值稳定性
选择FFT算法。对于变换
满足第一个标准的尺寸
但不是第二个,CUFFT 使用了更多
通用混合基 FFT 算法
通常速度较慢且数值较少
准确的。因此,如果可能的话
最好使用的大小是
两个或四个,或其他小数的幂
素数(例如,三、五或
七)。另外,二元幂
CUFFT中的FFT算法使
通过阻塞方式使用共享内存
信号的子变换不
满足第一个标准。

I think this is your answer. It's using different algorithms

http://forums.nvidia.com/index.php?showtopic=195094

"I have been working on a similar
problem. In the cuFFT manual, it is
explained that cuFFT uses two
different algorithms for implementing
the FFTs. One is the Cooley-Tuckey
method and the other is the Bluestein
algorithm. When the dimensions have
prime factors of only 2,3,5 and 7 e.g
(675 = 3^3 x 5^5), then 675 x 675
performs much much better than say 674
x 674 or 677 x 677. This is done using
the Cooley-Tuckey method. If one of
the prime factors is a prime other
than 2,3,5 or 7, then the FFT for that
number is implemented using the
Bluestein method. The Bluestein method
is slower and there is also some
precision loss. "

From the manual: http://developer.download.nvidia.com/compute/cuda/3_1/toolkit/docs/CUFFT_Library_3.1.pdf

The CUFFT library implements several
FFT algorithms, each having different
performance and accuracy. The best
performance paths correspond to
transform sizes that meet two
criteria:

  • Fit in CUDAʹs shared
    memory
  • Are powers of a single factor
    (for example, powers of two)

These
transforms are also the most accurate
due to the numeric stability of the
chosen FFT algorithm. For transform
sizes that meet the first criterion
but not second, CUFFT uses a more
general mixed‐radix FFT algorithm that
is usually slower and less numerically
accurate. Therefore, if possible it is
best to use sizes that are powers of
two or four, or powers of other small
primes (such as, three, five, or
seven). In addition, the power‐of‐two
FFT algorithm in CUFFT makes maximum
use of shared memory by blocking
sub‐transforms for signals that do not
meet the first criterion.

念﹏祤嫣 2024-11-05 22:25:14

只是为 Ade 的答案添加更多背景知识:

一般来说,离散傅立叶变换需要大量计算。 N 点的一维 FFT 需要 N*N 次乘法。 FFT(快速傅立叶变换)速度更快,只是因为在 N 是 2 的幂的情况下,可以重写方程,这样您只需要 N * log2 N 次乘法。

在大多数应用中,您并不关心样本的确切数量。因此,您选择二的幂,以获得最佳性能。

三或五的幂也可以,但二的幂是最快的,也是最容易编写的算法,因此多年来它已成为主导。

Just to add a little more background to Ade's answer:

In general, a discrete Fourier transform is a lot of computation. A single dimenision FFT of N points takes N*N multiplications. FFT (Fast Fourier Transforms) are faster only because in case N is a power of 2, the equations can be rewritten such that you need only N * log2 N multiplications.

In most applications, you don't care about the exact number of samples. So you choose powers of two, to get the best performance.

Powers of three, or five would also work, but powers of two are the fastest, and is the easiest algorithm to write, so that has become dominant over the years.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文