问题具体描述:
eg.
cpp
__global__ void Updata_HomJm(float* H,float *HJm,float* fr,float *gr,float* ur,float* urgrJm,float*wpd,float *w, float *wJm,int n)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
float t = 0.0;//H*zp
int idx_Ai = idx*n;
for (int j=0; j<n; j++)
{
t += H[idx_Ai + j] * fr[j];//0
if((j==idx)||(abs(wpd[idx])==2&&abs(wpd[j])==2))
{
HJm[idx_Ai + j]=H[idx_Ai + j];
}
else
{
HJm[idx_Ai + j]=0;
}
}
gr[idx]=t;
if (abs(wpd[idx])==2)
{
wJm[idx]=w[idx];
urgrJm[idx]=-(ur[idx]+gr[idx]);
}else
{
wJm[idx]=0.0;
urgrJm[idx]=0.0;
}
}
这里gr,wJm,urgrJm都是计算后需要输出的值,这三个数组同时乱码,
第一个想法即使:代码有误
采取排除的方式,先将if判断都注释掉,发现还是有错;
再将wJm和urgrJm有关的都注释,发现gr计算结果正常,那么大概率不是__global__函数错误,将错误锁定在这两个数组身上,猜测可能是gr,wJm,urgrJm这三个数组size不同,则检查主函数,发现是wJm忘开辟空间。
解决办法
在主函数加入
cpp
cudaMalloc((void**)&d_wJm, sizeof(float)*WS*1);