有关for循环的KERNEL函数出错

之前发过一段400多行的代码真是难为大家了,特别感谢 ice tianyuan08,给我提供了这么多宝贵的意见,今天早上我把代码打印出来,反复看也没有发现什么错误,我开始怀疑KERNEL函数的正确性,果然是因为刚开始我的赋的值有特殊性(1e-30),掩盖了错误,导致结果看似正确。

我的目的是将以下代码并行:


 

我写的KERNEL函数如下:

__global__ void KernelV(int *dev_XMatrix,double *dev_V,double *dev_VK)
{
int tid=threadIdx.x;
int bid=blockIdx.x;
int xIndex=bid*blockDim.x+tid;

if(xIndex<XROW)
{
if(xIndex==0)
{ 
for(int j=0;j<XCOL;j++)
{
dev_V[xIndex]=dev_V[xIndex]+dev_XMatrix[j]*dev_XMatrix[j+xIndex*XCOL]*dev_VK[j];
__syncthreads();
}
}
else
{
for(int j=0;j<XCOL;j++)
{
dev_V[xIndex]=dev_V[xIndex]+dev_XMatrix[j]*dev_XMatrix[j+xIndex*XCOL]*dev_VK[j];
__syncthreads();
dev_V[xIndex*XROW]=dev_V[xIndex*XROW]+dev_XMatrix[j+xIndex*XCOL]*dev_XMatrix[j]*dev_VK[j];
}
__syncthreads();
}
}
}

结果在gpuV.txt和CPUV.txt文件中,我发现只有前101个数据是CPU和GPU结果是相同的,即V[0~100]结果是一致的,V[101~9999]在GPU中结果全为0,显然是错误的。[attach]2838[/attach]
就目前我自己的理解,我感觉KERNEL挺正确的呀!

串行的代码没有显示出来,在这里我补充一下:

	for(int j=0;j<XCOL;j++)
	{
		for(int i=0;i<XROW;i++)
		{
			for(int k=0;k<XROW;k++)
			{
				V[i*XROW+k]=V[i*XROW+k]+XMatrix[j+i*XCOL]*XMatrix[j+k*XCOL]*VK[j];
			}
		}
	}

如果XROW的数值大小合适,你可以取XROW个block,每个block内XROW个thread,都是一维的。
然后kernel里
int i=blockIdx.x;
int k=threadIdx.x;
V[i*XROW+k]=V[i*XROW+k]+XMatrix[j+i*XCOL]XMatrix[j+kXCOL]*VK[j];

就行了。
如果XROW比较大,你再适当调整下。

祝您编码愉快!

好的,真心感谢这个论坛!

欢迎您莅临本论坛,祝您编码愉快~