3

是否可以创建单个 FFTSetup数据结构并使用它同时执行多个 FFT 计算?会像以下工作吗?

FFTSetup fftSetup = vDSP_create_fftsetup(
                                         16,         // vDSP_Length __vDSP_log2n,
                                         kFFTRadix2  // FFTRadix __vDSP_radix
                                         );
NSAssert(fftSetup != NULL, @"vDSP_create_fftsetup() failed to allocate storage");

for (int i = 0; i < 100; i++)
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
  ^{
    vDSP_fft_zrip(
                  fftSetup,              // FFTSetup __vDSP_setup,
                  &(splitComplex[i]),    // DSPSplitComplex *__vDSP_ioData,
                  1,                     // vDSP_Stride __vDSP_stride,
                  16,                    // vDSP_Length __vDSP_log2n,
                  kFFTDirection_Forward  // FFTDirection __vDSP_direction
                  );
  });
}

我想答案取决于以下考虑:

1) 是否仅以“只读”方式vDSP_fft_zrip()访问其中的数据(或它指向的数据)?fftSetup或者在执行其 FFT 计算时fftSetup可能会写入一些临时缓冲区(暂存空间)?vDSP_fft_zrip()

2)如果fftSetup 以“只读”方式访问这样的数据,多个进程/线程/任务/块可以同时访问它吗?(我在考虑这样一种情况,即有可能多个进程打开同一个文件进行读取,但不一定用于写入或追加。这个类比合适吗?)

FFTSetup在相关的说明中,数据结构占用了多少内存?有什么办法可以查到吗?(它是一种不透明的数据类型。)

4

3 回答 3

8

您可以创建一个 FFT 设置并重复和同时使用它。这是预期用途。(我是 vDSP_fft_zrip 的当前实现和 vDSP 中其他 FFT 实现的作者。)

于 2012-07-13T14:39:34.887 回答
2

使用傅里叶变换中,我们被告知FFTSetup包含 FFT 权重数组,它是一系列复指数。vDSP_create_fftsetup文档

一旦准备好,设置结构可以被 FFT 函数(读取结构中的数据并且不改变它)重复使用任何(2 的幂)长度,直到您创建结构时指定的长度。

所以

  1. 从概念上讲,vDSP_fft_zrip不需要修改权重数组,因此它似乎是不会改变的 FFT 函数之一(FFTSetup没有看到除了创建/销毁之外的任何函数),但是不能保证实际的实现是做什么的——它可以做任何事情。

  2. 如果 vDSP_fft_zrip真正FFTSetup以只读方式访问它,那么可以从多个线程中执行此操作。

至于内存使用,FFT 权重数组是 e^{i*k*2*M_PI/N} for k = [0..N-1],它们是 N 个复浮点值,所以 2*N*sizeof (漂浮)。

但是那些复杂的指数是非常对称的,所以谁知道,在幕后实现可能需要更少的内存。或者更多!

在您的情况下,N = 2^16,因此看到最多使用 256k 也就不足为奇了。

这会让你在哪里?我认为FFTSetup可以从多个线程访问似乎是合理的,但它似乎没有记录。你可能很幸运。或者现在或在框架的未来版本中不幸和令人不快的惊喜。

所以……你觉得幸运吗?

于 2012-07-08T16:40:30.360 回答
-1

为此,我不会尝试与 vDSP 函数或 Accelerate 框架(其中 vDSP 是其中的一部分)中的任何其他函数进行任何显式并发。为什么?因为 Accelerate 已经被设计为利用多个内核以及给定处理器实现的特定细微差别,所以代表您 - 请参阅http://developer.apple.com/library/mac/#DOCUMENTATION/Darwin/Reference/ManPages /man7/vecLib.7.html. You may end up essentially re-parallelizing already parallel computations that are internal to the implementation (if not now, then possibly in a later version). The best approach to the Accelerate framework is generally to assume that it's more clever than you are and just use it in the simplest way possible, then do your performance measurements. If those measurements reflect a level of performance that is somehow insufficient for your needs, then try your own optimizations (and/or file a bug report against the Accelerate framework at http://bugreport.apple.com since the authors of that framework are always interested in knowing where or if their efforts somehow fell short of developer requirements).

于 2012-07-08T18:49:45.947 回答