我想对2-D阵列进行1-D FFT(比如仅沿着列)。我使用的是vs2010 / C#和managedcuda。
我遇到了一些问题:
如何制作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.可以对大型1-D阵列进行1-D FFT。例如,我从data11
制作一维数组。然后在10个元素的部分中执行FFT? CudaFFTPlanMany
有一些选择,但我不是100%清楚如何使用它们或它们如何对我有用。
如果我不清楚,请询问更多细节。非常感谢。
编辑:我得到了更多细节,问题仍然存在,但我制作了data11
的一维数组,然后分两批进行了批量fft。它给了我想要的结果。语法是:
CudaFFTPlanMany planm;
planm = new CudaFFTPlanMany(1, n, 1,cufftType.D2Z);
干杯
答案 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数组的特殊提示:包含inembed
或n
等维度信息的数组有点“反向”:[height, width]
而不是[width, height]
...