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()データ内(またはそれが指すデータ)にのみアクセスしますか?それとも、FFT 計算を実行する際に書き込まれるfftSetup一時的なバッファ (スクラッチ スペース) があるのでしょうか?fftSetupvDSP_fft_zrip()

2) そのようなデータがfftSetup 「読み取り専用」の方法でアクセスされている場合、複数のプロセス/スレッド/タスク/ブロックが同時にアクセスしても問題ありませんか? (複数のプロセスが読み取り用に同じファイルを開く可能性がある場合を考えていますが、必ずしも書き込みや追加用ではありません。この類推は適切ですか?)

FFTSetup関連するメモとして、データ構造によってどれだけのメモリが占​​有されているのでしょうか? 調べる方法はありますか?(不透明なデータ型です。)

4

3 に答える 3

8

1 つの FFT セットアップを作成し、それを繰り返し同時に使用することができます。これが使用目的です。(私は vDSP_fft_zrip の現在の実装および vDSP の他の FFT 実装の作成者です。)

于 2012-07-13T14:39:34.887 に答える
2

フーリエ変換の使用ではFFTSetup、一連の複素指数である FFT 重み配列が含まれていると言われています。vDSP_create_fftsetupのドキュメントには、

準備が完了すると、セットアップ構造体は、構造体の作成時に指定された長さ (2 の累乗) まで、FFT 関数 (構造体のデータを読み取り、変更しない) によって繰り返し使用できます。

それで

  1. 概念的には、vDSP_fft_zripは重み配列を変更する必要がないため、変更しない FFT 関数の 1 つであるように見えます (作成/破棄以外に行うFFTSetupものは見たことがありません)。実際の実装が何をするか - それは何でもできます。

  2. vDSP_fft_zrip本当にFFTSetup読み取り専用の方法でアクセスする場合は、複数のスレッドからアクセスしても問題ありません。

メモリ使用量に関しては、FFT 重み配列は e^{i*k*2*M_PI/N} であり、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. 実装の内部にある既に並列化されている計算を本質的に再並列化することになる可能性があります (現在そうでない場合は、おそらく後のバージョンで)。Accelerate フレームワークへの最善のアプローチは、一般に、それが自分よりも賢いと想定し、可能な限り単純な方法でそれを使用してから、パフォーマンス測定を行うことです。これらの測定値がパフォーマンスのレベルを反映しており、ニーズに対して不十分である場合は、独自の最適化を試してください (および/またはhttp://bugreport.apple.comで Accelerate フレームワークに対してバグ レポートを提出してください。そのフレームワークの作成者は彼らの努力がどこで開発者の要件を満たしていないか、またはどこで失敗したかを知ることに常に関心があります)。

于 2012-07-08T18:49:45.947 に答える