0

我在 JTransfroms 中有关于 {1850 000,1} 元素的向量 .. 但日志:

exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000

它有效......但仍然需要大约 1 分钟!它对我来说太多了..有线程..在 matlab 中大约需要 2 秒。在 Jtrans 的官方网站上。

:limitations: 非二次方大小的一维变换是顺序的(当使用混合基数时)。2 次幂大小的一维变换只能使用 2 或 4 个线程。

线程数必须是二的幂数。

有人能解释一下这个二次方大小是多少吗?

4

2 回答 2

0

2 的幂是(在计算机如此存在的情况下)只有因子 2 的数字。那是 2、4、8、16、...、1024 2048 等。因此,如果您使用正好有 1024 个数字的向量作为输入,它应该走得更快。

我真的无法说出“大约 {1850 000,1} 个元素”是什么意思,尽管您的数字可能要高得多?该库显然不会使用超过 4 个线程(无论如何在许多系统上不会做太多事情),因此您不应该获得太多的速度增益。也许还有另一个问题。

于 2012-10-24T15:43:13.733 回答
0

我将发布一些 FFT 的背景知识来解释 radix-2 的限制。

首先要注意的是,大多数 FFT 实现都使用CT FFT 算法。这是通过将 FFT 拆分为越来越小的 FFT 来实现的,就像合并排序首先将排序限制为基本情况一样。

CT 算法最常用的方法是将问题分成两半N = N0 / 2)。这并不是说混合基数的情况是不可能的,但是由于以下原因,“二的幂”的情况是最有效的,因此也是最常用的。

现在大多数 FFT 实现的主要瓶颈不是算法的实现,而是硬件 - 处理器管道等等。显然,这些都建立在二进制逻辑基础之上,导致带宽几乎完全是 2 N

出于这个原因,在内存中使用 2 N个字节的 FFT 将被更快地计算,这是由于寄存器中的精确拟合和原始问题的精确细分。

TL;DR:用不相关的数据(0)填充您的 FFT 向量,直到它达到最接近的 2 次方。然后只使用有效的结果数据。

但是,您的异常看起来好像您只是内存不足。您使用的是 32 位操作系统吗?如果是这样,由于您的大型操作,您可能会超出分配的 2GB 进程内存或其他一些限制。

于 2012-10-24T15:49:56.590 回答