CUDA上多项式拟合问题的误差
我尝试使用CUDA在设备上做一些简单的循环,但似乎很难理解CUDA。当我在普通C代码中使用CUDA内核函数时,每次函数调用都会得到0。 原代码: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)
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;
}