背景
最近在看cufft这个库,传统的cufftPlan3d()这种plan接口逐渐被nvidia舍弃了,说是要用最新的cufftPlanMany,这个函数呢又依赖一个什么Advanced Data Layout(地址),最终把这个api搞得乌烟瘴气很难理解,为了理解自己写了一些测试来验证各个参数的意思,这里简单做一下总结。下面是函数声明以及对应的参数解释,看不懂的话可以结合后面的例子琢磨琢磨。
cufftResult cufftPlanMany(
cufftHandle *plan,
int rank,
int *n,
int *inembed,
int istride,
int idist,
int *onembed,
int ostride,
int odist,
cufftType type,
int batch);
1D
先说说这函数能干啥,因为对于很多信号而言是需要采样的,对于搞过信号的同学理解起来比较方便,比如来了一串信号a=[0,1,2,3,4,5,6,7,8,9], 如果采样频率是2,那么就会得到b=[0,2,4,6,8]长度为5的信号,搁在以前,你要做fft的话,你需要自己提前写好代码把b摘出来,但是现在不需要了,直接用a信号就可以,nv把这个工作做了,具体如下:
//一维不饶很好理解
int rank = 1,
int n[] = {5}, //这个值代表这个维度的fft()的输入输出大小
int inembed[] = {10}, //代表这个维度的输入数据长度
int istride = 2, // 代表采样步长,这个就很蠢,每个维度必须一样
int idist = 10, // 一个batch的输入信号长度,按理说等于各个维度乘积和
int onembed[] = 5, //输出信号的该维度长度(输出准备的内存大小)
int ostride = 1, //同上
int odist = 5, //同上
int batch = 1;
图示如下,这里没有画输出,意思和输入一样,接下来做个实验试试。