CUDA中二维阵列的一维FFT变换

时间:2013-05-24 08:50:07

标签: c# cuda

我想对2-D阵列进行1-D FFT(比如仅沿着列)。我使用的是vs2010 / C#和managedcuda。

我遇到了一些问题:

  1. 如何制作2-D CudaDeviceVariable?我试过了:

            int n1 = 10;
            int n2 = 2;
            int batch = 1;
            //SizeT test;
    
            CudaDeviceVariable<double>[,] datad;
            datad = new CudaDeviceVariable<double>[n1, n2]; 
    
  2. datad不是CudaDeviceVariable。它现在是一个普通的二维阵列。所以我无法在设备中分配内存。喜欢:

        double[,] data11 = new double[,] {{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }};
    
        datad.CopyToDevice(data11);//Error??
    

    这是一个错误,因为CopyToDevice不是System.Array的方法。如果我datad n1*n2 CudaDeviceVariable,则错误仍然存​​在,因为CopyToDevicedouble[]作为输入参数,而不是[,].上述方法适用于一维数组。

    2.可以对大型1-D阵列进行1-D FFT。例如,我从data11制作一维数组。然后在10个元素的部分中执行FFT? CudaFFTPlanMany有一些选择,但我不是100%清楚如何使用它们或它们如何对我有用。

    如果我不清楚,请询问更多细节。非常感谢。

    编辑:我得到了更多细节,问题仍然存在,但我制作了data11的一维数组,然后分两批进行了批量fft。它给了我想要的结果。语法是:

                CudaFFTPlanMany planm;
                planm = new CudaFFTPlanMany(1, n, 1,cufftType.D2Z);
    

    干杯

1 个答案:

答案 0 :(得分:2)

在设计managedCuda时我决定反对多维数组支持,因为我找不到任何保证不允许CLR引入一些行间距的保证。当与p / invoke交互时,多维数组的处理方式也不同。

因此,唯一受支持的数组是简单的1D数组,类似于C / C ++中的数组。因此,2D数组只是一个大小为width * height的大型1D数组,而且索引的计算方式类似于y * width + x

在设备端,您可以使用CudaPitchedDeviceVariable<double>为每条线引入一些额外的字节,以便在正确对齐的存储器地址上开始每个阵列线 - &gt;另见CUDA编程指南,例如在主机端,这些阵列仍然表示为一个简单的1D阵列,没有任何额外的音调。

关于关于袖口的第二个问题:是的,CudaFFTPlanMany有批处理是要走的路,managedCuda实现的界面与原始的cufft API完全相同,有关详细信息,请参阅CUFFT用户指南中的第2章。对于给定的示例,您的计划将如下所示:

int[] n = new int[] { 10 };
plan = new CudaFFTPlanMany(1, n, 2, cufftType.D2Z);

2D数组的特殊提示:包含inembedn等维度信息的数组有点“反向”:[height, width]而不是[width, height] ...