7

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

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

4

1 回答 1

10

您可以将其作为主机-> 设备副本的一部分来执行。每个副本将获取主机上的一个连续输入数组,并以跨步方式将其复制到设备。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);
于 2012-11-23T22:32:45.987 回答