将数据复制到“cufftComplex”数据结构?

时间:2012-11-23 20:09:34

标签: cuda memcpy

我将数据存储为浮点数组(单精度)。我有一个数组用于我的实际数据,一个数组用于我的复杂数据,我用它作为FFT的输入。如果我想使用CUDA cufft库,我需要将此数据复制到cufftComplex数据类型中。来自nVidia:“cufftComplex是一种单精度浮点复数数据类型,由交错的实部和虚部组成。”由袖带操作的数据存储在cufftComplex的数组中。

如何快速将数据从普通C数组复制到cufftComplex数组中?我不想使用for循环,因为它可能是最慢的选项。我不知道如何在这种类型的数组数据上使用memcpy,因为我不知道它是如何存储在内存中的。谢谢!

1 个答案:

答案 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);