float2 cufftcomplex到fftw_complex

时间:2016-11-07 20:44:17

标签: cuda fftw

我想在我的代码上使用FFTW库。我将float2数据类型转换为fftw_complex。但我明白了:

  

分段错误

这是我的代码。

test.cu

typedef float2 cplx;
int DoFFT_Operation( cplx* DatafftOneSlice, float* out, int *dim)
{
    cout << "DO CPU FFT RSS Operation" << endl;
    int xdim = dim[0];
    int ydim = dim[1];
    cout << "XDIM " << std::to_string(xdim) << " YDIM " << std::to_string(ydim) << endl;
    // int slicedim = dim[2];
    int bitdim = 1;
    // int sizeOneSlice = xdim*ydim*bitdim;
    int sizeOneImage = xdim*ydim;

    //FFTW PLAN
    fftw_plan pfftw;

    pfftw = fftw_plan_dft_1d(sizeOneImage, reinterpret_cast<fftw_complex*>(DatafftOneSlice), reinterpret_cast<fftw_complex*>(DatafftOneSlice), FFTW_BACKWARD, FFTW_ESTIMATE);

    fftw_execute(pfftw);

    // fft_it(DatafftOneSlice, sizeOneImage);
    // cplx* input, float* out, int N, int x, int y, int bit
    DoSomething(DatafftOneSlice, out, sizeOneImage, xdim, ydim, bitdim);


    fftw_destroy_plan(pfftw);

    fftw_cleanup();

    return 0;
}

如何将float2(CUDA)转换为fftw_complex?

1 个答案:

答案 0 :(得分:1)

我已经解决了我的问题,

我只是将fftw_更改为fftwf_,因为fftw_具有double数据类型而fftwf_具有float数据类型。

test.cu

typedef float2 cplx;
int DoFFT_Operation( cplx* DatafftOneSlice, float* out, int *dim)
{
    cout << "DO CPU FFT RSS Operation" << endl;
    int xdim = dim[0];
    int ydim = dim[1];
    cout << "XDIM " << std::to_string(xdim) << " YDIM " << std::to_string(ydim) << endl;
    // int slicedim = dim[2];
    int bitdim = 1;
    // int sizeOneSlice = xdim*ydim*bitdim;
    int sizeOneImage = xdim*ydim;

    //FFTW PLAN
    fftwf_plan pfftw;

    pfftw = fftwf_plan_dft_1d(sizeOneImage, reinterpret_cast<fftwf_complex*>(DatafftOneSlice), reinterpret_cast<fftwf_complex*>(DatafftOneSlice), FFTW_BACKWARD, FFTW_ESTIMATE);

    fftwf_execute(pfftw);

    // fft_it(DatafftOneSlice, sizeOneImage);
    // cplx* input, float* out, int N, int x, int y, int bit
    DoSomething(DatafftOneSlice, out, sizeOneImage, xdim, ydim, bitdim);


    fftwf_destroy_plan(pfftw);

    fftwf_cleanup();

    return 0;
}