哪位大侠帮我看看错误时怎么回事?

zhangdc318 2011-03-23 02:51:21
我的目的是想求出信噪比,也就是存在1250*512个数据,其中每512点数据一组一组的求出其最大值和其余均值的比值,存放到一个数组,返回CPU,我想把每组的比值放在GPU上进行并行处理,但是总是出现一大堆错误,请教一下各位大侠怎么回事。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <cutil.h>
#include <cufft.h>
#include <cuda_runtime.h>
#include <cutil_inline.h>
#include "mat.h"
#include "afx.h"
#include "keti1_kernel.cu"

#define NX 512
#define BATCH 1250*8
#define T NX*BATCH
#define DATA_SIZE 30720000
typedef float2 Complex;
static __device__ __host__ inline Complex ComplexAdd(Complex, Complex);

//声明
void runTest(int argc, char** argv);

//main函数

int main(int argc,char**argv)
{
runTest(argc,argv);
cutilExit(argc,argv);
}

//对CUDA做一个简单测试
void runTest(int argc, char** argv)
{

if( cutCheckCmdLineFlag(argc, (const char**)argv, "device") )
cutilDeviceInit(argc, argv);
else
cudaSetDevice( cutGetMaxGflopsDeviceId() );

//在CPU端分配空间
Complex * a=(Complex*)malloc(sizeof(Complex) * DATA_SIZE);

//调用matlab中回波数据仿真产生的dat文件
FILE *fp;
cufftComplex temp[1250*512*8];
if((fp=fopen("D:\\TBHA_sim_tbh_20090401_alpha_170_beta_-10_x0_-1.09_y0_-4.64_z0_-1.50_r0_5.00_v_1100.dat","rb"))==NULL)
printf("error");
//读取文件数据
for(int m=0;m<8;m++)
{
for(int n=0;n<512*1250;n++)
{
short temp1;
fread(&temp1,2,1,fp);
//printf("(%10d )",temp1);
temp[m*1250*512+n].x = short(temp1);
//printf("%10.2f\r\n",temp[m*1250*512+n].x);
//printf("\n)");
}
for(int n=0;n<512*1250;n++)
{
short temp1;
fread(&temp1,2,1,fp);
//printf("(%d )",temp1);
temp[m*1250*512+n].y = short(temp1);
//printf("%f\r\n",temp[m*1250*512+n].y);
//printf("\n)");
}
}
fclose(fp);

//为数组在GPU端分配空间
cufftComplex *idata;
cudaMalloc((void**)&idata, sizeof(cufftComplex)*T);

//为FFT后的数组分配空间
cufftComplex *odata;
cudaMalloc((void**)&odata, sizeof(cufftComplex)*T);
//设置时间记录函数
unsigned int timer;
cutCreateTimer(&timer);
int numIterations = 1;

//设置初始计算时间
cutStartTimer(timer);
//将数组从主机端拷贝到设备端
cudaMemcpy(idata, temp, sizeof(cufftComplex)*T, cudaMemcpyHostToDevice);
//创建一维句柄
cufftHandle plan;
// Create a 1D IFFT plan.
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
//Inverse transform the signal in place.
cufftExecC2C(plan, (cuComplex*)idata, (cuComplex*)odata,CUFFT_FORWARD);
cuComplex FFT_odata[T];
//将数据拷贝回主机端
cudaMemcpy(FFT_odata, odata, sizeof(cufftComplex)*T, cudaMemcpyDeviceToHost);
//设置最后计算时间并输出时间
cutStopTimer(timer);
float FFT_Time = cutGetTimerValue(timer);

//输出数据
for(int i=0; i<10; i++)
{
//printf("FFT_odata[%d].x:%f\n FFT_odata[%d].y:%f\n", i,FFT_odata[i].x,i,FFT_odata[i].y);
printf("%f + j %f\n", FFT_odata[i].x,FFT_odata[i].y);
//printf("(%5f) ", FFT_odata[i].x ,"(%5f) ", FFT_odata[i].y );
}
printf("\n");
printf("FFT_time: %0.3f ms\n", FFT_Time/ numIterations);
printf("\n");
//将输出信号转变成对应的模
float FFT_odata_M[T];
for(int i=0;i<T;i++)
{
FFT_odata_M[i]=sqrt(pow(FFT_odata[i].x,2)+pow(FFT_odata[i].y,2));
/*printf("%f\n",FFT_odata_M[i]);*/
}
for(int i=0;i<10;i++)
{
printf("%f",FFT_odata_M[i]);printf("\n");
}
printf("\n");

//将8路天线进行非相参积累

float FFT_odata_SUM[640000];
for(int jj=0;jj<640000;jj++)
{
FFT_odata_SUM[jj] = 0;
for(int ii=0;ii<8;ii++)
{
FFT_odata_SUM[jj] += FFT_odata_M[jj+640000*ii];
}
//printf("%f",FFT_odata_SUM[jj]);
}

//去除相位参考信号

for(int ii=173;ii<183;ii++)
{
for(int jj=0;jj<1250;jj++)
{
FFT_odata_SUM[ii+jj*512] = 0;
//printf("%f",FFT_odata_SUM[jj]);
//printf("\n");
}
printf("%f",FFT_odata_SUM[ii]);
printf("\n");
}

//记录每帧信号对应的帧号
int i;
float FFT_odata_N[2][5120000];
for(int i=0;i<5120000;i++)
{
FFT_odata_N[1][i]=FFT_odata_M[i];

}
for(int i=0;i<10;i++)
{
printf("%5.0f",FFT_odata_N[1][i]);
}

for(int i=0;i<T;i++)
{
int k=i/512;
FFT_odata_N[2][i]=k+1;
//printf("%d\n",k);
}
并行计算每帧信号的信噪比
float * GPUdata; float *SNR;
#define DATA_SIZE_ 640000
#define THREAD_NUM 256;
#define BLOCK_NUM 5;
//gpu端分配空间
cudaMalloc( (void**) &GPUdata, sizeof(int) * DATA_SIZE_);
cudaMalloc( (void**) &SNR, sizeof(int) * DATA_SIZE_);
clock_t start,end;
start=clock();
cudaMemcpy(GPUdata, FFT_odata_SUM, sizeof(int) * DATA_SIZE_, cudaMemcpyHostToDevice);
//调用内核函数
keti1_Kernel<<< BLOCK_NUM,THREAD_NUM,0 >>>(GPUdata, SNR);
//CPU分配空间
float * CPUdata;
cudaMalloc((void**) &CPUdata,sizeof(int) * DATA_SIZE_);
//将结果拷贝到CPU
cudaMemcpy(&CPUdata,SNR,sizeof(int),cudaMemcpyDeviceToHost);
end=clock();
return end-start;
//释放存贮器
cudaFree(GPUdata);
cudaFree(SNR);
cudaFree(time);
//计算信噪比所用时间[/color]//
clock_t min_start,max_end;

//摧毁CUFFT句柄
cufftDestroy(plan);
//释放存储器
cudaFree(idata);
cudaFree(odata);
cudaFree(FFT_odata);
system("PAUSE");
cudaThreadExit();
}
//////////////////////////////////////////////////////////////////////////////////
//// Complex operations
//////////////////////////////////////////////////////////////////////////////////
//
// Complex addition
static __device__ __host__ inline Complex ComplexAdd(Complex a, Complex b)
{
Complex c;
c.x = a.x + b.x;
c.y = a.y + b.y;
return c;
}


内核函数如下:
#ifndef _KETI1_Kernel_h_
#define _KETI1_Kernel_h_
#define DATA_SIZE_ 640000
#define THREAD_NUM 256
#define BLOCK_NUM 5
float *FFT_odata_M;
__global__ static void
keti1_Kernel(float *aa, float* SNR)

{
const int ID=blockIdx.x*blockDim.x+threadIdx.x;
int index;
float max=-9999.9f,sum=0.0f,ave=0.0f;
if(ID<1250)
{
for(int i=0;i<512;i++)
{
int index=ID*512+i;
sum+=aa[index];
//计算出每帧最大信号
if(aa[index]>max)
{
max=aa[index];
}
//求出每帧信号均值
float result=sum-max;
ave=max/1240;
}

//求出信噪比
SNR[ID]=max/ave;
}
}
#endif


接结果总是出错,错误如下:
1>------ 已启动生成: 项目: keti1.cu, 配置: Debug Win32 ------
1>Compiling with CUDA Build Rule...
1>"d:\CUDA\bin\nvcc.exe" -arch sm_10 -ccbin "D:\Program Files\Microsoft Visual Studio 8\VC\bin" -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MTd " -I"d:\CUDA\include" -I"\C\common\inc" -maxrregcount=32 --compile -o "Debug\keti1.cu.obj" "d:\ProgramData\NVIDIA Corporation\NVIDIA CUDA SDK\projects\pro_zdc\keti1.cu\keti1.cu\keti1.cu"
1>keti1.cu
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(336) : warning C4005: “THREAD_NUM”: 宏重定义
1> d:\programdata\nvidia corporation\nvidia cuda sdk\projects\pro_zdc\keti1.cu\keti1.cu\keti1_kernel.cu(4) : 参见“THREAD_NUM”的前一个定义
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(337) : warning C4005: “BLOCK_NUM”: 宏重定义
1> d:\programdata\nvidia corporation\nvidia cuda sdk\projects\pro_zdc\keti1.cu\keti1.cu\keti1_kernel.cu(5) : 参见“BLOCK_NUM”的前一个定义
1>d:\programdata\nvidia corporation\nvidia cuda sdk\projects\pro_zdc\keti1.cu\keti1.cu\keti1_kernel.cu(26): warning: variable "result" was declared but never referenced
1>d:\programdata\nvidia corporation\nvidia cuda sdk\projects\pro_zdc\keti1.cu\keti1.cu\keti1_kernel.cu(12): warning: variable "index" was declared but never referenced
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(209): warning: function "fopen"
1>D:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\stdio.h(234): here was declared "deprecated ("This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.")"
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: too few arguments in function call
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: expected a ">>>"
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: expected a "("
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: expected an expression
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: argument of type "int" is incompatible with parameter of type "float *"
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: expected a ")"
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(345): error: expected an expression
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(352): error: return value type does not match the function type
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(354): warning: statement is unreachable
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(315): warning: variable "i" was declared but never referenced
1>d:/ProgramData/NVIDIA Corporation/NVIDIA CUDA SDK/projects/pro_zdc/keti1.cu/keti1.cu/keti1.cu(404): warning: function "ComplexAdd" was declared but never referenced
1>8 errors detected in the compilation of "C:\Users\zdc\AppData\Local\Temp/tmpxft_0000513c_00000000-6_keti1.cpp1.ii".
1>项目 : warning PRJ0018 : 未找到下列环境变量:
1>$(NVSDKCOMPUTE_ROOT)
1>生成日志保存在“file://d:\ProgramData\NVIDIA Corporation\NVIDIA CUDA SDK\projects\pro_zdc\keti1.cu\keti1.cu\Debug\BuildLog.htm”
1>keti1.cu - 8 个错误,8 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

...全文
180 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
忆幽梦 2011-03-23
  • 打赏
  • 举报
回复
大哥你能把搞成代码格式么?看着眼晕不看了……

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧