我将数据存储为浮点数组(单精度)。我有一个数组用于我的实际数据,一个数组用于我的复杂数据,我用它作为FFT的输入。如果我想使用CUDA cufft库,我需要将此数据复制到cufftComplex
数据类型中。来自nVidia:“cufftComplex
是一种单精度浮点复数数据类型,由交错的实部和虚部组成。”由袖带操作的数据存储在cufftComplex
的数组中。
如何快速将数据从普通C数组复制到cufftComplex
数组中?我不想使用for
循环,因为它可能是最慢的选项。我不知道如何在这种类型的数组数据上使用memcpy
,因为我不知道它是如何存储在内存中的。谢谢!
答案 0 :(得分:8)
您可以将此作为主机的一部分 - >设备副本。每个副本将采用主机上的一个连续输入数组,并以跨步方式将其复制到设备。 CUDA中复杂数据类型的存储布局与Fortran和C ++中为复杂类型定义的布局兼容,即作为一个结构,其中实部跟随虚部。
float * real_vec; // host vector, real part
float * imag_vec; // host vector, imaginary part
float2 * complex_vec_d; // device vector, single-precision complex
float * tmp_d = (float *) complex_vec_d;
cudaStat = cudaMemcpy2D (tmp_d, 2 * sizeof(tmp_d[0]),
real_vec, 1 * sizeof(real_vec[0]),
sizeof(real_vec[0]), n, cudaMemcpyHostToDevice);
cudaStat = cudaMemcpy2D (tmp_d + 1, 2 * sizeof(tmp_d[0]),
imag_vec, 1 * sizeof(imag_vec[0]),
sizeof(imag_vec[0]), n, cudaMemcpyHostToDevice);