使用 fft 加速器时的内存警告

Posted

技术标签:

【中文标题】使用 fft 加速器时的内存警告【英文标题】:Memory warning when using the accelerator for fft 【发布时间】:2013-01-03 13:11:02 【问题描述】:

我在这里发布了一个我使用的函数来获取加速器 fft。

Setup the accelerator framework for fft on the iPhone

效果很好。 问题是,我实时使用它,所以对于每个新的音频缓冲区,我都会用新的缓冲区调用这个函数。

由于这些行(可能),我收到了内存警告

A.realp = (float *) malloc(nOver2 * sizeof(float));
 A.imagp = (float *) malloc(nOver2 * sizeof(float));

问题:

我是否有其他方法,但要一次又一次地对其进行 malloc(不要忘记我必须每秒多次使用新缓冲区来喂它)

我究竟如何释放它们? (代码行)

会不会是因为fft对系统的影响太大?

任何消除此警告的方法都会对我有很大帮助。

非常感谢。

【问题讨论】:

【参考方案1】:

这些事情应该在程序开始时做一次:

为缓冲区分配内存,使用类似float *buffer = malloc(NumberOfElements * sizeof *buffer);的代码。 使用FFTSetup setup = vDSP_create_fftsetup(log2n, FFT_RADIX2); 之类的代码创建 FFT 设置。 同时测试返回值。如果mallocvDSP_create_fftsetup返回0,则写入错误信息并退出程序或采取其他异常行为。

这些事情应该在程序结束时完成一次:

使用 vDSP_destroy_fftsetup(setup); 之类的代码销毁 FFT 设置。 释放缓冲区的内存,使用类似free(buffer);的代码。

在您的程序中间,当您处理样本时,代码应该使用现有的缓冲区和设置。因此,指向缓冲区的变量和设置必须对该代码可见。您可以将它们作为参数传递(可能在结构中组合在一起)或将它们设为全局(这应该只是小程序的临时解决方案)。

应安排您的程序,以便在处理样本时无需分配内存或创建 FFT 设置。

所有分配的内存最终都应该被释放。

【讨论】:

所以我必须把这个: vDSP_create_fftsetup(log2n, FFT_RADIX2);一开始,但是 A.realp = (float *) malloc(nOver2 * sizeof(float)); ??每次获取新缓冲区时我都必须 malloc A,那么如何将其从实时处理中删除?换句话说,这个 malloc 应该在哪里? @Rant:为什么你会写“每次获取新缓冲区时我都必须 malloc A”?您应该分配一次缓冲区并多次重用它。是什么阻止你这样做?每次获得新样本时,您都可以用不同的数据填充缓冲区。 缓冲区不是我的问题,而是 &A 。苹果说他必须被分配。所以我想我会在开始时分配一次 - 你是对的。非常感谢。 只想添加 'DSP_destroy_fftsetup(fftSetup)' 是一条非常有用的行。没有它,内存增长是巨大的,会很快杀死 ios 设备。 @Colin:我希望你不会在你的程序中反复创建和破坏 FFT 设置。使用它们的预期方法是在需要之前创建一次设置,然后多次使用它,然后在不再需要它之后将其销毁(或者至少在不久的将来不会,而当前任务仍在继续)。【参考方案2】:

如果您正在 malloc'ing 并且从不释放,您将耗尽内存。确保使用 free() 来“释放”你的内存。

*注意: free() 实际上并没有擦除任何内存。它只是告诉系统我们已经完成了内存,它可以用于其他分配。

// Example:

// allocating memory
int *intpointer;
intpointer = malloc(sizeof(int));

// ... do stuff...

// 'Freeing' it when you are done
free(intpointer);

【讨论】:

非常感谢我知道这一点。我已经用 free(A.realp) 释放了它;但它没有用......我猜你不能在 1 秒内 malloc 和 free 这么多次。 @Rant:重复调用 malloc 和 free 没有分配内存的积累不会引起任何关于内存的警告。每秒可以执行多少次的唯一限制是例程执行的速度。

以上是关于使用 fft 加速器时的内存警告的主要内容,如果未能解决你的问题,请参考以下文章

将图像选择器相机转移到一个视图到另一个视图时的内存警告

win10安装CUDA出现警告,该怎么解决

使用少量内存时 ipad 应用程序内存警告

使用仪器收到内存警告

Instruments 指出内存不足警告,但内存使用率非常低

使用仪器解决内存不足警告