求助:
我最近将我写的程序用cuda改写,在写核函数的时候出现了一些问题。
详情如下:
程序的物理意义是建立64512256的三维空间格点,我将数据分为444块,每块包含1612864个格点,一个物理上的格点的数据由一个SM计算。
其中出错的核函数的目的是计算每个格点的CompositeInvFFT_g变量,函数使用的CompositeInvFFT_g和EpsilonStar_g数据空间在GPU中,CAverage, Block_Width_R和NScale_R在CPU中。已检验在调用函数时,EpsilonStar_g,CAverage, Block_Width_R和NScale_R的数据不存在问题。
核函数调用:
dim3 dimGrid(Block_num_R[0],Block_num_R[1],Block_num_R[2]);
dim3 dimBlock(Block_Width_R[0],Block_Width_R[1],Block_Width_R[2]);
InitEpsilonPreINandOUT_1st_GPU<<<dimGrid, dimBlock>>>(CompositeInvFFT_g, EpsilonStar_g,
CAverage,
Block_Width_R, NScale_R);
核函数参数的含义和值:
三个维度的格点数目:NScale_R:(64,512,256)
三个维度的块数目:Block_num_R:(4,4,4)
每一块三个维度的SM数目:Block_Width_R:(16,128,64)
CAverage:一个21个double的数组
CompositeInvFFT_g, EpsilonStar_g:两个double长数组,每个数组长度是645122566double,也就是说,每个格点占据6个double数组的内容
核函数内容:
global void InitEpsilonPreINandOUT_1st_GPU(double *t_CompositeInvFFT, double *t_EpsilonStar,
double *t_CAverage,
int *Block_Width_g, int *t_NScale)
{
shared int R21g[6][6];
R21g[0][0]= 0, R21g[0][1]= 1, R21g[0][2]= 2, R21g[0][3]= 3, R21g[0][4]= 4, R21g[0][5]= 5;
R21g[1][0]= 1, R21g[1][1]= 6, R21g[1][2]= 7, R21g[1][3]= 8, R21g[1][4]= 9, R21g[1][5]=10;
R21g[2][0]= 2, R21g[2][1]= 7, R21g[2][2]=11, R21g[2][3]=12, R21g[2][4]=13, R21g[2][5]=14;
R21g[3][0]= 3, R21g[3][1]= 8, R21g[3][2]=12, R21g[3][3]=15, R21g[3][4]=16, R21g[3][5]=17;
R21g[4][0]= 4, R21g[4][1]= 9, R21g[4][2]=13, R21g[4][3]=16, R21g[4][4]=18, R21g[4][5]=19;
R21g[5][0]= 5, R21g[5][1]=10, R21g[5][2]=14, R21g[5][3]=17, R21g[5][4]=19, R21g[5][5]=20;
shared double CPointArray_g[6];
for (int i=0;i<3;i++) CPointArray_g[i]=1.0;
for (int i=3;i<6;i++) CPointArray_g[i]=2.0;
int pos_g;
int x_g=blockIdx.xBlock_Width_g[0]+threadIdx.x;
int y_g=blockIdx.yBlock_Width_g[1]+threadIdx.y;
int z_g=blockIdx.z*Block_Width_g[2]+threadIdx.z;
if ((x_g<t_NScale[0])&&(y_g<t_NScale[1])&&(z_g<t_NScale[2]))
{
pos_g=(x_g*t_NScale[1]+y_g)*t_NScale[2]+z_g;
//CompositeInvFFT=CAverageEpsilonStar;
for (int i=0; i<6; i++)
{
t_CompositeInvFFT[pos_g6+i]=0.0;
for (int j=0; j<6; j++)
{
t_CompositeInvFFT[pos_g6+i]+=t_CAverage[R21g[i][j]]
t_EpsilonStar[pos_g*6+j]*CPointArray_g[j];
}
}
}
}
可以看出x_g,y_g,z_g表示了物理上该格点的坐标,pos_g表示了该格点的数据在CompositeInvFFT_g, EpsilonStar_g这两个长数组的位置。
在计算这一函数过程中,通过GPU_result = cudaGetLastError()得到GPU_result=9
通过GPU_message = cudaGetErrorString(GPU_result)得到GPU_message=invalid configuration argument
想知道是不是我的核函数设定存在问题?我应该以怎样的思路去调试?谢谢大牛们的指导!