我想对二维数组进行一维 FFT(仅沿列)。我正在使用带有 Managedcuda 的 vs2010/C#。
我遇到一些问题:
如何制作 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);
二维数组的特殊提示:包含维度信息的数组,如 inembed
或n
是一种“逆”:[height, width]
而不是[width, height]
...
关于c# - CUDA 中 2D 数组的 1D FFT 变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731013/