一个简单的张量乘法问题

之前针对这个函数曾经问了大神们一下,现在发现还是存在问题。

详情如下:
程序的物理意义是建立646464的三维空间格点,我将数据分为888块,每块包含888个格点,一个物理上的格点的数据由一个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,64,64
三个维度的块数目:Block_num_R 8,8,8
每一块三个维度的SM数目:Block_Width_R 8,8,8
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.y
Block_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_g
6+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这两个长数组的位置。

当我紧接着将计算得到的结果CompositeInvFFT_g通过cudaMemcpy传递到CPU以便输出检验的时候,通过cudagetlasterror报错,错误码为4:unspecified launch failure。
不知道我是否哪里写错了会倒置这么一个简单的张量乘法出现错误?

GPU的程式碼是per thread運行的,再寫入shared的時候應該是讓每個thread寫入一個值再syncthreads(),而不是每個thread都寫一次吧!

Block_Width_R和NScale_R你都說是存在host上的變數了自然沒辦法拿進去GPU的kernel運算

還有為什麼不用blockDim.{x,y,z}、gridDim.{x,y,z}就好了?

看你發了好多篇問題真心的建議你慢慢來先補充一些CUDA的基礎知識後再來努力

LZ您好:

请您参阅一下如下帖子:

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6397

祝您好运~

谢谢您的回复。
shared写的是存在问题,但是我把它改为局部变量以后还是存在问题的。
用自己写的Block_Width_R和NScale_R而不是使用blockDim的原因是,有些时候我的规模不被设定的block数整除,这样最后一个block的thread数应该没有用完,用一维数组来存三维数据的时候如果这些不需要的thread开动的话可能会产生错误,所以在搞不太清楚的情况下,自己设了变量而没有使用blockDim,这是我马虎不求甚解了。
我的基础知识的确很薄弱,主要是也不知道该看哪些书籍来系统学习cuda编程,基本上是用google在摸索着学习。如果您方便的话可否推荐一二?

谢谢,好好研究一下。。。。

谢谢您,的确是__global__函数不能使用host存储的原因,是我看书不认真,感谢您的鞭策!