千军版主:您好!
以下代码实现的高速FFT(一段代码),采样点为N=32(需要5级蝶形运算,每级蝶形运算需要16个旋转因子),将数据从全局存储器读入到共享存储器,而使用的旋转因子事先计算好存储在纹理存储器中,将CUDA数组与纹理绑定,然后利用纹理拾取函数读取其中一行的旋转因子。
程序生成解决方案的时候没有出现错误,但是debug完了之后,没有产生数据,花了好长时间还是没有改出来,请问版主,程序错误的具体原因在什么地方?
谢谢了,版主!
//初始化变换核,旋转因子
Complex W = (Complex)malloc(sizeof(Complex) * K);
for(unsigned int i3=0;i3<K;i3++)
{
W[i3].x=cos(2PI/Ki3);
W[i3].y=-1sin(2PI/Ki3);
}
//将旋转因子存储在二维数组中,之后读取
Complex power[5][16]=
{{W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0],W[0]},
{W[0],W[8],W[0],W[8],W[0],W[8],W[0],W[8],W[0],W[8],W[0],W[8],W[0],W[8],W[0],W[8]},
{W[0],W[4],W[8],W[12],W[0],W[4],W[8],W[12],W[0],W[4],W[8],W[12],W[0],W[4],W[8],W[12]},
{W[0],W[2],W[4],W[6],W[8],W[10],W[12],W[14],W[0],W[2],W[4],W[6],W[8],W[10],W[12],W[14]},
{W[0],W[1],W[2],W[3],W[4],W[5],W[6],W[7],W[8],W[9],W[10],W[11],W[12],W[13],W[14],W[15]}
};
Complex host2D = (Complex)calloc(widthheight, sizeof(Complex)); /构造查找表¨ª
cudaArray cuArray; // CUDA数组
for(int row = 0; row < height; ++row) //初始化内存(查找表)数据
{
for(int col = 0; col < width; ++col)
{
host2D[rowwidth + col] = power[row][width];
}
}
//每个像元由一个float2型数据构成
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc();
checkCudaErrors(cudaMallocArray(&cuArray, &channelDesc, width, height)); //申请显存空间
checkCudaErrors(cudaMemcpyToArray(cuArray, 0, 0, host2D, sizeof(float)widthheight, cudaMemcpyHostToDevice)); //将内存数据拷贝到显存中,数据已经初始化
//设置纹理参数
texRef2D.addressMode[0]=cudaAddressModeClamp;
texRef2D.addressMode[1]=cudaAddressModeClamp;
texRef2D.filterMode=cudaFilterModePoint;
texRef2D.normalized=false;
checkCudaErrors(cudaBindTextureToArray(texRef2D, cuArray)); // 将显存数据与纹理绑定
//内核函数,其中有二维纹理拾取
static global void FFT_T(Complex* const DataIn,Complex* DataOut,const unsigned int N)
{
extern shared Complex sdata;
const unsigned int tid_in_block=threadIdx.x; //线程在线程块中的位置
if (tid_in_block<N)
{
sdata[tid_in_block]=DataIn[tid_in_block];
sdata[tid_in_block+N/2]=DataIn[tid_in_block+N/2]; //将global memory中的数据读入shared memory
__syncthreads(); //线程块中的线程同步
if (tid_in_block<N/2)
{
unsigned int p,q;
Complex Xp,XqWn;
float2 Wn;
float stage=0.0;
for (unsigned int Ns=1;Ns<N;Ns*=2)
{
p=tid_in_block/NsNs2+tid_in_block%Ns;
q=p+Ns;
Wn=tex2D(texRef2D,tid_in_block,stage++);
XqWn=ComplexMul1(sdata[q],Wn);
Xp=sdata[p];
sdata[p]=ComplexAdd(Xp,XqWn);
sdata[q]=ComplexSub(Xp,XqWn);
__syncthreads();
}
DataOut[p]=sdata[p];
DataOut[q]=sdata[q];
}
}
}
谢谢您了。。。