c# - CUDA 中 2D 数组的 1D FFT 变换

标签 c# cuda

我想对二维数组进行一维 FFT(仅沿列)。我正在使用带有 Managedcuda 的 vs2010/C#。

我遇到一些问题:

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

            int n1 = 10;
            int n2 = 2;
            int batch = 1;
            //SizeT test;
    
            CudaDeviceVariable<double>[,] datad;
            datad = new CudaDeviceVariable<double>[n1, n2]; 
    

但是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,错误仍然存​​在,因为 CopyToDevice 采用 double[ ] 作为输入参数,而不是 [,]. 以上方法适用于一维数组。

2.是否可以对大型一维数组进行一维 FFT。例如,我从 data11 创建一维数组。然后对10个元素的部分进行FFT? CudaFFTPlanMany 有一些选项,但我不是 100% 清楚如何使用它们或者它们对我有何用处。

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

编辑:我得到了更多详细信息,问题仍然存在,但我制作了 data11 的一维数组,然后分两批大小为 10 执行批量 FFT。它给了我结果我想了。语法为:

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

干杯

最佳答案

在设计 ManagedCuda 时,我决定不支持多维数组,因为我找不到任何保证 CLR 不允许引入某些行间距。在与 p/invoke 进行互操作时,多维数组的处理方式也有所不同。

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

在设备端您可以使用CudaPitchedDeviceVariable<double>它向每行引入了一些额外的字节,以便在正确对齐的内存地址上开始每个数组行 -> 另请参阅 CUDA 编程指南,例如第73页。在主机端,这些阵列仍然表示为简单的一维阵列,没有任何额外的间距。

关于你关于袖口的第二个问题:是的,CudaFFTPlanMany使用批处理是可行的方法,managementCuda 实现的接口(interface)与原始 cufft API 完全相同,有关更多详细信息,请参阅 CUFFT 用户指南中的第 2 章。对于给定的示例,您的计划将如下所示:

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

二维数组的特殊提示:包含维度信息的数组,如 inembedn是一种“逆”:[height, width]而不是[width, height] ...

关于c# - CUDA 中 2D 数组的 1D FFT 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731013/

相关文章:

c# - 同时处理数千个数据库调用

c# - 在我自己的登录表单中使用 Windows 身份验证

c# - 如何通过 c# 从 QuickBooks Desktop 中查找员工扣减、添加项目?

c# - 将连接字符串发送到 ApplicationDBContext

cuda - 在我的程序中分配统一内存。运行后,它抛出 CUDA 错误 :out of memory, 但仍有可用内存

c++ - 使用 Qt Creator 编译 Optix - 链接问题

c - CUDA 中的高斯消除(无旋转)

c# - 有没有办法使用 Serilog 提供自定义属性格式?

cuda - 有效载荷中的 Optix 动态大小数组

c - 可以在CUDA设备中使用SAL(科学算法库)吗?