CUDA上多项式拟合问题的误差

CUDA上多项式拟合问题的误差,cuda,gpu,Cuda,Gpu,我尝试使用CUDA在设备上做一些简单的循环,但似乎很难理解CUDA。当我在普通C代码中使用CUDA内核函数时,每次函数调用都会得到0。 原代码: double evaluate(int D, double tmp[], long *nfeval) { /* polynomial fitting problem */ int i, j; int const M=60; double px, x=-1, dx=(double)M, result=0; (*nfeval)

我尝试使用CUDA在设备上做一些简单的循环,但似乎很难理解CUDA。当我在普通C代码中使用CUDA内核函数时,每次函数调用都会得到0。 原代码:

double evaluate(int D, double tmp[], long *nfeval)
{
/* polynomial fitting problem */
   int   i, j;
   int const M=60;
   double px, x=-1, dx=(double)M, result=0;

   (*nfeval)++;
   dx = 2/dx;
   for (i=0;i<=M;i++)
   {
      px = tmp[0];
      for (j=1;j<D;j++)
      {
     px = x*px + tmp[j];
      }
      if (px<-1 || px>1) result+=(1-px)*(1-px);
      x+=dx;
   }
   px = tmp[0];
   for (j=1;j<D;j++) px=1.2*px+tmp[j];
   px = px-72.661;
   if (px<0) result+=px*px;
   px = tmp[0];
   for (j=1;j<D;j++) px=-1.2*px+tmp[j];
   px =px-72.661;
   if (px<0) result+=px*px;
   return result;
}
double evaluation(int D,double tmp[],long*nfeval)
{
/*多项式拟合问题*/
int i,j;
int const M=60;
双px,x=-1,dx=(双)M,结果=0;
(*nfeval)++;
dx=2/dx;
对于(i=0;iNo),变量结果不会在多个线程之间共享

我的建议是在共享内存中有一个结果值矩阵,每个线程一个结果,计算每个值并将其减少为一个值

      __global__ void cEvaluate_temp(double* tmp,double *global_result, int D)
{  
  int M =60;
  double px; 
  double x=-1;
  double dx=(double)M ;
  int j;
  dx = 2/dx;
  int idx = blockIdx.x * blockDim.x + threadIdx.x;  

  __shared__ shared_result [blocksize];


  if (idx >= 60) return;

  px = tmp[0];

  for (j=1;j<D;j++)
  {
    px = x*px + tmp[j];
  }

  if (px<-1 || px>1) 
  { 
    result[threadIdx] +=(1-px)*(1-px); 
  }  
       x+=dx;  
 }

 __syncthreads();

if( threadIdx.x == 0) {
total_result = 0.
for (idx in blocksize){
   total_result += result[idx];
}
global_result[0] = total_result;
}
\uuuuuuu全局\uuuuuuu无效ceevaluate\u temp(双*tmp,双*global\u结果,int D)
{  
int M=60;
双px;
双x=-1;
双dx=(双)M;
int j;
dx=2/dx;
int idx=blockIdx.x*blockDim.x+threadIdx.x;
__共享结果[块大小];
如果(idx>=60)返回;
px=tmp[0];

对于(j=1;jFeaton):请提供能够显示您的问题的最小代码段。乍一看,我可以看到一个错误:sizeof(tmp)不会给出数组的大小。
    __global__ void cEvaluate_temp(double* tmp,double result, int D)
{  
  int M =60;
  double px; 
  double x=-1;
  double dx=(double)M ;
  int j;
  dx = 2/dx;
  int idx = blockIdx.x * blockDim.x + threadIdx.x;  
  if (idx < 60)   //<==>if (idx < M)
  {  
      px = tmp[0];
      for (j=1;j<D;j++)
      {
       px = x*px + tmp[j];
      }

      if (px<-1 || px>1) 
      { __syncthreads();
        result+=(1-px)*(1-px); //+=
      }  
       x+=dx;  
  }  
}
    __global__ void cEvaluate(double* tmp,double result, int D)
{  
  int idx = blockIdx.x * blockDim.x + threadIdx.x;  
  if (idx < 60)   //<==>if (idx < M)
  {  
        result+=1;
        printf("res = %f ",result); //-deviceemu, make emu=1

  }  
} 
      __global__ void cEvaluate_temp(double* tmp,double *global_result, int D)
{  
  int M =60;
  double px; 
  double x=-1;
  double dx=(double)M ;
  int j;
  dx = 2/dx;
  int idx = blockIdx.x * blockDim.x + threadIdx.x;  

  __shared__ shared_result [blocksize];


  if (idx >= 60) return;

  px = tmp[0];

  for (j=1;j<D;j++)
  {
    px = x*px + tmp[j];
  }

  if (px<-1 || px>1) 
  { 
    result[threadIdx] +=(1-px)*(1-px); 
  }  
       x+=dx;  
 }

 __syncthreads();

if( threadIdx.x == 0) {
total_result = 0.
for (idx in blocksize){
   total_result += result[idx];
}
global_result[0] = total_result;
}