之前发过一段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挺正确的呀!