I’m trying to perform a Real to Complex 512-long transformation of an array of 90 elements.
Thus I’m allocating a real input array of 512 elements and a complex output array of 257 elements (512/2 + 1).
Furthermore, I’m trying to perform both with double and float values: definitions below are used to smoothly move from the former to the latter.
When using float, everything seem to work properly (coefficients tested with python as well).
But when moving to double precision, the coefficients make no sense; only the first 127 and a half complex values seem to be non-zero, equivalent to 257 numbers totally.
Does this has anything to do with data alignment?
I’ve read from the documentation of the function cufftExecR2C that
Pointers to
idataandodataare both required to be aligned tocufftComplexdata type in single-precision transforms andcufftDoubleComplexdata type in double-precision transforms.
But I can’t understand how to deal with that, provided that is the problem.
Below the definitions, the code and the outputs are presented.
Thanks in advance for the support
#define USE_FLOAT 1
typedef int I;
#if USE_FLOAT
typedef float D;
typedef cufftComplex Complex;
#define cufft_r2c cufftExecR2C
#define cufft_c2r cufftExecC2R
#define cufft_r2r cufftExecR2R
#define cufft_c2c cufftExecC2C
#else
typedef double D;
typedef cufftDoubleComplex Complex;
#define cufft_r2c cufftExecD2Z
#define cufft_c2r cufftExecZ2D
#define cufft_r2r cufftExecD2D
#define cufft_c2c cufftExecZ2Z
#endif
Here is the code used:
void perform_r2c_fft(D* h, int h_size)
{
cudaError_t cuda_error;
int N = 512;
int Nout = N / 2 + 1;
// -- Device side output data allocation
Complex* dH;
cuda_error = cudaMalloc((void**)&dH, sizeof(Complex) * Nout);
cudaMemset(dH, 0, sizeof(Complex) * Nout);
// -- Device side input data allocation and initialization
D* dh;
cuda_error = cudaMalloc((void**)&dh, sizeof(D) * N);
cuda_error = cudaMemcpy(dh, h, sizeof(D) * h_size, cudaMemcpyHostToDevice);
// Zero padding from h_size to N
cuda_error = cudaMemset(&dh[h_size], 0, sizeof(D) * (N - h_size));
// Plan definition
cufftHandle plan;
cufftResult res = cufftPlan1d(&plan, N, CUFFT_R2C, 1);
if (res != CUFFT_SUCCESS) throw "Error creating cufftPlan1d";
// Calculate frequency domain filter coefficients
res = cufft_r2c(plan, dh, dH);
cudaDeviceSynchronize();
// --- Host-side output
Complex* H = new Complex[Nout];
cuda_error = cudaMemcpy(H, dH, sizeof(Complex) * Nout, cudaMemcpyDeviceToHost);
printf("Output Array: ");
for (int i = 0; i < Nout; i++) printf("%.6f + j%.6f\n", H[i].x, H[i].y);
cufftDestroy(plan);
}
int main()
{
D h[90]{ 0.00026579, 0.00080432, 0.00137513, 0.00200095, 0.00269536,
0.00345938, 0.0042791 , 0.00512453, 0.00594991, 0.00669539,
0.00729014, 0.00765669, 0.00771625, 0.00739475, 0.00662901,
0.00537293, 0.00360291, 0.00132242, -0.00143499, -0.00460419,
-0.00808895, -0.01176434, -0.0154811 , -0.01907175, -0.02235826,
-0.02516079, -0.02730716, -0.02864244, -0.02903819, -0.0284007 ,
-0.02667787, -0.02386411, -0.02000309, -0.015188 , -0.0095592 ,
-0.00329947, 0.00337317, 0.01021462, 0.01696536, 0.02336222,
0.02915055, 0.0340962 , 0.03799665, 0.04069074, 0.04206649,
0.04206649, 0.04069074, 0.03799665, 0.0340962 , 0.02915055,
0.02336222, 0.01696536, 0.01021462, 0.00337317, -0.00329947,
-0.0095592 , -0.015188 , -0.02000309, -0.02386411, -0.02667787,
-0.0284007 , -0.02903819, -0.02864244, -0.02730716, -0.02516079,
-0.02235826, -0.01907175, -0.0154811 , -0.01176434, -0.00808895,
-0.00460419, -0.00143499, 0.00132242, 0.00360291, 0.00537293,
0.00662901, 0.00739475, 0.00771625, 0.00765669, 0.00729014,
0.00669539, 0.00594991, 0.00512453, 0.0042791 , 0.00345938,
0.00269536, 0.00200095, 0.00137513, 0.00080432, 0.00026579 };
perform_r2c_fft(h, 90);
}
/// --- USING FLOAT
Output Array:
-0.004787 + j0.000000
-0.003775 + j0.002294
-0.000699 + j0.001347
-0.000595 + j-0.008797
-0.019200 + j-0.027261
-0.072286 + j-0.031513
-0.148878 + j0.020220
-0.193315 + j0.156675
-0.125115 + j0.349673
0.102561 + j0.499567
0.444363 + j0.478348
0.756379 + j0.214323
0.863254 + j-0.238895
0.664218 + j-0.706277
0.207039 + j-0.977974
-0.325518 + j-0.927667
-0.713126 + j-0.585248
-0.817141 + j-0.116092
-0.645789 + j0.276827
-0.329441 + j0.461726
-0.031767 + j0.430649
0.139872 + j0.273683
0.171677 + j0.105784
0.118912 + j0.000730
0.051290 + j-0.030742
0.010265 + j-0.019492
-0.000086 + j-0.001405
0.004055 + j0.005833
0.007647 + j0.003390
0.006282 + j-0.000814
0.002885 + j-0.002309
0.000626 + j-0.001716
-0.000205 + j-0.001029
-0.000695 + j-0.000757
-0.001139 + j-0.000330
-0.001011 + j0.000273
-0.000288 + j0.000302
0.000125 + j-0.000571
-0.000528 + j-0.001535
-0.001779 + j-0.001478
-0.002350 + j-0.000349
-0.001613 + j0.000680
-0.000355 + j0.000491
0.000057 + j-0.000711
-0.000814 + j-0.001617
-0.002003 + j-0.001251
-0.002217 + j-0.000027
-0.001239 + j0.000732
-0.000131 + j0.000245
-0.000051 + j-0.000914
-0.001013 + j-0.001476
-0.001923 + j-0.000867
-0.001792 + j0.000221
-0.000783 + j0.000619
0.000020 + j-0.000053
-0.000197 + j-0.001021
-0.001123 + j-0.001239
-0.001715 + j-0.000509
-0.001338 + j0.000353
-0.000418 + j0.000433
0.000068 + j-0.000305
-0.000347 + j-0.001030
-0.001153 + j-0.000971
-0.001453 + j-0.000225
-0.000933 + j0.000387
-0.000167 + j0.000228
0.000042 + j-0.000486
-0.000479 + j-0.000966
-0.001120 + j-0.000709
-0.001177 + j-0.000022
-0.000601 + j0.000350
-0.000018 + j0.000033
-0.000029 + j-0.000598
-0.000577 + j-0.000852
-0.001037 + j-0.000475
-0.000909 + j0.000106
-0.000344 + j0.000269
0.000052 + j-0.000136
-0.000120 + j-0.000646
-0.000636 + j-0.000711
-0.000919 + j-0.000279
-0.000665 + j0.000171
-0.000159 + j0.000163
0.000062 + j-0.000270
-0.000213 + j-0.000643
-0.000657 + j-0.000560
-0.000780 + j-0.000125
-0.000454 + j0.000185
-0.000037 + j0.000049
0.000034 + j-0.000365
-0.000293 + j-0.000601
-0.000642 + j-0.000412
-0.000632 + j-0.000016
-0.000279 + j0.000161
0.000033 + j-0.000059
-0.000018 + j-0.000421
-0.000354 + j-0.000530
-0.000598 + j-0.000278
-0.000485 + j0.000054
-0.000144 + j0.000111
0.000059 + j-0.000154
-0.000079 + j-0.000442
-0.000392 + j-0.000443
-0.000530 + j-0.000164
-0.000348 + j0.000087
-0.000046 + j0.000047
0.000054 + j-0.000228
-0.000140 + j-0.000433
-0.000405 + j-0.000349
-0.000448 + j-0.000075
-0.000228 + j0.000091
0.000016 + j-0.000022
0.000028 + j-0.000280
-0.000192 + j-0.000400
-0.000395 + j-0.000257
-0.000359 + j-0.000011
-0.000128 + j0.000072
0.000049 + j-0.000088
-0.000011 + j-0.000309
-0.000231 + j-0.000351
-0.000366 + j-0.000173
-0.000270 + j0.000028
-0.000050 + j0.000038
0.000057 + j-0.000144
-0.000055 + j-0.000316
-0.000254 + j-0.000291
-0.000321 + j-0.000102
-0.000186 + j0.000045
0.000004 + j-0.000004
0.000046 + j-0.000188
-0.000096 + j-0.000304
-0.000260 + j-0.000227
-0.000267 + j-0.000046
-0.000112 + j0.000044
0.000037 + j-0.000049
0.000023 + j-0.000217
-0.000131 + j-0.000276
-0.000251 + j-0.000166
-0.000208 + j-0.000008
-0.000051 + j0.000028
0.000051 + j-0.000091
-0.000007 + j-0.000230
-0.000155 + j-0.000239
-0.000229 + j-0.000110
-0.000150 + j0.000015
-0.000005 + j0.000004
0.000050 + j-0.000126
-0.000038 + j-0.000229
-0.000168 + j-0.000195
-0.000197 + j-0.000064
-0.000095 + j0.000023
0.000026 + j-0.000026
0.000038 + j-0.000151
-0.000067 + j-0.000215
-0.000170 + j-0.000150
-0.000159 + j-0.000029
-0.000048 + j0.000019
0.000043 + j-0.000055
0.000018 + j-0.000166
-0.000089 + j-0.000192
-0.000161 + j-0.000107
-0.000119 + j-0.000005
-0.000011 + j0.000006
0.000047 + j-0.000082
-0.000004 + j-0.000170
-0.000104 + j-0.000162
-0.000143 + j-0.000070
-0.000079 + j0.000007
0.000016 + j-0.000012
0.000042 + j-0.000103
-0.000026 + j-0.000164
-0.000110 + j-0.000130
-0.000118 + j-0.000039
-0.000043 + j0.000010
0.000033 + j-0.000032
0.000030 + j-0.000116
-0.000045 + j-0.000150
-0.000108 + j-0.000097
-0.000091 + j-0.000017
-0.000013 + j0.000005
0.000040 + j-0.000051
0.000014 + j-0.000122
-0.000059 + j-0.000130
-0.000099 + j-0.000067
-0.000063 + j-0.000003
0.000009 + j-0.000005
0.000039 + j-0.000067
-0.000002 + j-0.000120
-0.000067 + j-0.000106
-0.000084 + j-0.000042
-0.000036 + j0.000003
0.000024 + j-0.000018
0.000032 + j-0.000078
-0.000017 + j-0.000111
-0.000069 + j-0.000082
-0.000066 + j-0.000022
-0.000014 + j0.000003
0.000031 + j-0.000030
0.000022 + j-0.000083
-0.000029 + j-0.000098
-0.000065 + j-0.000059
-0.000047 + j-0.000009
0.000004 + j-0.000001
0.000032 + j-0.000041
0.000010 + j-0.000083
-0.000036 + j-0.000081
-0.000056 + j-0.000038
-0.000028 + j-0.000002
0.000016 + j-0.000008
0.000029 + j-0.000049
-0.000001 + j-0.000077
-0.000039 + j-0.000063
-0.000044 + j-0.000022
-0.000012 + j0.000001
0.000022 + j-0.000016
0.000022 + j-0.000052
-0.000010 + j-0.000067
-0.000038 + j-0.000045
-0.000031 + j-0.000011
0.000001 + j-0.000000
0.000023 + j-0.000022
0.000014 + j-0.000051
-0.000016 + j-0.000054
-0.000032 + j-0.000030
-0.000019 + j-0.000004
0.000009 + j-0.000003
0.000021 + j-0.000026
0.000006 + j-0.000046
-0.000018 + j-0.000041
-0.000025 + j-0.000017
-0.000008 + j-0.000000
0.000013 + j-0.000007
0.000016 + j-0.000027
-0.000000 + j-0.000038
-0.000017 + j-0.000028
-0.000016 + j-0.000008
-0.000000 + j0.000000
0.000013 + j-0.000009
0.000010 + j-0.000024
-0.000004 + j-0.000027
-0.000013 + j-0.000016
-0.000008 + j-0.000003
0.000004 + j-0.000001
0.000010 + j-0.000010
0.000005 + j-0.000018
-0.000005 + j-0.000017
-0.000008 + j-0.000007
-0.000002 + j-0.000000
0.000005 + j-0.000002
0.000006 + j-0.000007
0.000001 + j-0.000010
-0.000003 + j-0.000006
-0.000002 + j-0.000002
0.000001 + j0.000000
0.000002 + j-0.000001
0.000001 + j-0.000002
0.000000 + j0.000000
/// --- WHEN USING DOUBLE
Output Array:
1.056853e-314 + j-1.112691e+304
2.009552e+300 + j-3.978238e+298
-5.845404e+304 + j-2.001387e+294
-4.961443e+299 + j-2.765925e+304
-1.567726e+295 + j-9.632719e+300
-5.201272e+304 + j-9.459616e+296
-9.563614e+301 + j-4.370071e+305
-5.903759e+299 + j-3.882458e+301
-7.552066e+305 + j-2.031627e+300
-3.773517e+297 + j-1.342530e+305
-6.865519e+298 + j9.516175e+298
-9.231439e+303 + j-9.418773e+289
3.757104e+301 + j-2.295619e+302
4.262638e+297 + j1.384369e+302
-4.169404e+301 + j2.290669e+300
1.969902e+303 + j-3.946731e+300
1.939703e+302 + j9.362080e+304
-3.672554e+292 + j1.041087e+303
1.253759e+306 + j3.290171e+299
6.475637e+301 + j3.229789e+305
3.009233e+299 + j3.170461e+299
2.684883e+304 + j7.019249e+296
1.517106e+300 + j3.236788e+304
1.081254e+291 + j6.399427e+299
6.667138e+304 + j-6.435954e+297
-1.976242e+299 + j8.134584e+303
-1.917638e+301 + j-6.474342e+303
7.058091e+300 + j-1.113822e+302
-2.538572e+304 + j1.080112e+296
-1.569459e+302 + j-1.898432e+304
6.443101e+291 + j-5.533434e+302
-3.068953e+304 + j-1.166655e+290
-3.802716e+303 + j-1.528066e+305
-1.238919e+295 + j-3.082286e+303
-5.092469e+305 + j-5.480403e+292
-1.697495e+301 + j-1.303525e+305
1.871401e+297 + j4.164233e+297
-3.657025e+303 + j7.917431e+299
4.217182e+300 + j-7.027831e+301
8.817596e+300 + j3.049259e+299
-7.494932e+301 + j5.099129e+302
1.498692e+302 + j-8.239478e+300
2.106121e+304 + j1.032556e+305
-1.382783e+294 + j2.031178e+304
5.925819e+305 + j1.290224e+296
4.663937e+302 + j5.639285e+304
9.387252e+291 + j6.660779e+301
1.070437e+304 + j-1.761637e+293
4.598253e+302 + j2.299140e+304
-2.390619e+298 + j6.609436e+301
2.405509e+304 + j-5.731067e+301
-1.329523e+296 + j1.355715e+303
-2.405760e+303 + j-7.524686e+302
2.296130e+300 + j-6.136079e+303
-8.663927e+303 + j4.729869e+296
-3.596022e+303 + j-4.282579e+303
1.615520e+294 + j-8.717128e+303
-6.138839e+303 + j5.611409e+289
-5.386840e+304 + j-6.144206e+304
9.104833e+289 + j-4.098655e+304
-2.198376e+305 + j6.565169e+298
-7.659369e+301 + j-2.117953e+304
2.295139e+301 + j5.285447e+293
-1.633891e+302 + j3.433829e+301
0.000000e+00 + j-3.433825e+301
1.633890e+302 + j-5.285325e+293
-2.295131e+301 + j2.117955e+304
7.659385e+301 + j-6.565121e+298
2.198379e+305 + j4.098655e+304
-9.104596e+289 + j6.144210e+304
5.386848e+304 + j-5.611171e+289
6.138850e+303 + j8.717138e+303
-1.615501e+294 + j4.282573e+303
3.596017e+303 + j-4.729869e+296
8.663927e+303 + j6.136079e+303
-2.296130e+300 + j7.524686e+302
2.405757e+303 + j-1.355715e+303
1.329507e+296 + j5.731047e+301
-2.405511e+304 + j-6.609453e+301
2.390611e+298 + j-2.299145e+304
-4.598259e+302 + j1.761637e+293
-1.070436e+304 + j-6.660783e+301
-9.387252e+291 + j-5.639285e+304
-4.663937e+302 + j-1.290230e+296
-5.925819e+305 + j-2.031174e+304
1.382813e+294 + j-1.032553e+305
-2.106120e+304 + j8.239508e+300
-1.498692e+302 + j-5.099132e+302
7.494940e+301 + j-3.049253e+299
-8.817575e+300 + j7.027843e+301
-4.217164e+300 + j-7.917425e+299
3.657025e+303 + j-4.164223e+297
-1.871401e+297 + j1.303522e+305
1.697490e+301 + j5.480342e+292
5.092469e+305 + j3.082281e+303
1.238895e+295 + j1.528068e+305
3.802716e+303 + j1.166726e+290
3.068953e+304 + j5.533440e+302
-6.442949e+291 + j1.898433e+304
1.569461e+302 + j-1.080099e+296
2.538572e+304 + j1.113819e+302
-7.058091e+300 + j6.474332e+303
1.917635e+301 + j-8.134589e+303
1.976239e+299 + j6.435949e+297
-6.667142e+304 + j-6.399434e+299
-1.081273e+291 + j-3.236790e+304
-1.517116e+300 + j-7.019299e+296
-2.684888e+304 + j-3.170477e+299
-3.009239e+299 + j-3.229786e+305
-6.475637e+301 + j-3.290174e+299
-1.253759e+306 + j-1.041087e+303
3.672615e+292 + j-9.362097e+304
-1.939699e+302 + j3.946736e+300
-1.969898e+303 + j-2.290664e+300
4.169408e+301 + j-1.384367e+302
-4.262618e+297 + j2.295626e+302
-3.757100e+301 + j9.419010e+289
9.231439e+303 + j-9.516119e+298
6.865519e+298 + j1.342531e+305
3.773522e+297 + j2.031627e+300
7.552060e+305 + j3.882450e+301
5.903744e+299 + j4.370061e+305
9.563581e+301 + j9.459491e+296
5.201268e+304 + j9.632698e+300
1.567695e+295 + j2.765918e+304
4.961424e+299 + j2.001348e+294
5.845395e+304 + j3.978226e+298
-2.009560e+300 + j1.112691e+304
1.056853e-314 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00
0.000000e+00 + j0.000000e+00