2

cuFFTを使用してバッチを実験しています。しかし、私は正しい出力を得ているとは思わない。

int NX = 16;    // size of the array
int BATCH = 16; // # of batch

GPU に 2 つの配列を割り当てています。

float *src;
cufftComplex *dst;
cudaMalloc((void**)&src, sizeof(float)*NX*BATCH);
cudaMalloc((void**)&dst, sizeof(cufftComplex)*NX*BATCH);

次のような単純なカーネルでソース配列を初期化しています。

__global__ void initFloatArray(float *data, const int size) {
  const int i = (blockIdx.x * blockDim.x) + threadIdx.x;
  if (i < size) {
    data[i] = i % NX;
  }
}

基本的に、各配列には 0 から 15 までの値があります。これを 16 回取得します。

私は次のように計画を作成します。

cufftPlanMany(&plan, 1, &NX, nullptr, 1, NX, nullptr, 1, NX, CUFFT_R2C, BATCH);

そして、私は自分の計画を実行しています:

cufftExecR2C(plan, src, dst);

最後に、dstの内容をホストに転送します。しかし、値を出力すると、次のようになります。

 BATCH 0:
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  <-8, 8>.length = 11.3137
  <-8, 5.34543>.length = 9.62152
  <-8, 3.31371>.length = 8.65914
  <-8, 1.5913>.length = 8.15673
  <-8, 0>.length = 8
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  <-8, 8>.length = 11.3137
  <-8, 5.34543>.length = 9.62152
  <-8, 3.31371>.length = 8.65914
 BATCH 1:
  <-8, 1.5913>.length = 8.15673
  <-8, 0>.length = 8
  <120, 0>.length = 120
  <-8, 40.2187>.length = 41.0066
  <-8, 19.3137>.length = 20.905
  <-8, 11.9728>.length = 14.3996
  ...

反復的な出力を期待していましたが、16 個ごとではなく、9 個の数値ごとに繰り返されます。

私は何か間違ったことをしていますか?それとも、私が理解していない何かがあります。

4

1 に答える 1

3

実数値信号の DFT は、エルミート対称性を示します ( wikipedia の実入力 DFT を参照)。その結果、ポイント DFTの完全Nな複素数出力値は、最初の出力値のみから構築できます (つまり、他の出力は冗長です)。NN/2+1

これに対応して、実数値入力に対する多くの FFT 実装と同様に、cuFFT はスペクトルの冗長な上部を返しません ( cuFFT ライブラリ ユーザー ガイドのセクション 2.4 に示されています)。16 ポイント FFT の場合、16/2 + 1 = 9冗長性のない出力が得られます。FFT ごとのこれらの 9 つの値は、最終バッファーに連続してパックされますdst(したがって、9 つの複素数ごとに新しい FFT 結果が開始されます)。

于 2016-01-23T00:56:13.383 に答える