【问题标题】:cuFFT R2C batch output size doesn't match input sizecuFFT R2C 批量输出大小与输入大小不匹配
【发布时间】:2016-01-23 08:56:13
【问题描述】:

我正在用 cuFFT 对批处理进行试验。但我不认为我得到了正确的输出。

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

我在 GPU 上分配两个数组:

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
  ...

我期待一个重复的输出,但它每 9 个数字重复一次,而不是应该的每 16 个重复。

我做错了吗?还是有什么我不明白的地方。

【问题讨论】:

    标签: fft cufft


    【解决方案1】:

    实值信号的 DFT 表现出 Hermitian 对称性(请参阅 real-input DFT on wikipedia)。因此,N-point DFT 的完整N 复输出值可以仅从第一个N/2+1 输出值构造(即其他输出是冗余的)。

    相应地,与许多实值输入的 FFT 实现一样,cuFFT 不会返回频谱的冗余上部(如cuFFT library user's guide 的第 2.4 节所示)。在您使用 16 点 FFT 的情况下,您将因此获得 16/2 + 1 = 9 非冗余输出。然后,每个 FFT 的这 9 个值在您的最终 dst 缓冲区中背靠背打包(因此每 9 个复数开始一个新的 FFT 结果)。

    【讨论】:

    • 更准确地说,它是 floor(N/2)+1 个复数值。因此,对于 15 个,您将获得 8 个复合体。
    • @widgg 我认为你不需要这个floor,因为它会以任何方式返回一个整数。
    猜你喜欢
    • 2020-11-13
    • 2021-07-03
    • 2020-09-19
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2018-07-25
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多