将数据复制到"cufftComplex"数据结构中?

8
我有一些以浮点数数组(单精度)形式存储的数据。我有一个用于实际数据的数组,还有一个用作FFT输入的复杂数据数组。如果我想使用CUDA cufft库,我需要将这些数据复制到数据类型中。根据nVidia:“是由交错的实部和虚部组成的单精度浮点复数数据类型。”被cufft操作的数据存储在数组中。
如何快速地将我的数据从普通的C数组复制到数组中?我不想使用for循环,因为它可能是最慢的选项。我不知道如何在此类数据的数组上使用memcpy,因为我不知道它在内存中的存储方式。谢谢!
1个回答

11

您可以将此作为主机->设备复制的一部分来完成。每次复制都会将主机上连续的输入数组之一以步进方式复制到设备上。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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接