未使用的变量,为什么会影响输出结果?

我的一个程序不正常,逐个语句删除,累死我了,最后剩下如下这个最简单的cuda程序部分。让我很奇怪的是,一个变量是否使用,居然会影响我的程序结果。这到底是怎么回事啊,我要崩溃了:dizzy:
我是在windows xp上,使用vc 2008 、 cuda 5.x(前几天刚升级的)、Geforce 9800 GT(计算能力1.1的老显卡,没办法,穷啊)。编译命令行只是 nvcc why_thread2.cu


 

#include <stdio.h>
#include <stdlib.h>
global void why(int picnum, int dev_matchPair)
{
int i=threadIdx.x + blockIdx.x
blockDim.x;
int j=threadIdx.y + blockIdx.yblockDim.y;
dev_matchPair[j+i
picnum]=12;
}
int main(void)
{
int picnumR=36, TotalPtL=31199;
int matchedPointNum=0;
int i=0, j=0;
int *host_matchPair=NULL;
int *dev_matchPair=NULL;
int *dev_TotalPointNumLastPicR=NULL;

host_matchPair=(int )calloc(TotalPtLpicnumR, sizeof(int));
for (i=0;i<TotalPtL;i++)
for(j=0;j<picnumR;j++)
host_matchPair[j+ipicnumR]=-1;
cudaMalloc((void**)&dev_matchPair, TotalPtL
picnumRsizeof(int));
cudaMemcpy(dev_matchPair, host_matchPair,
TotalPtL
picnumR*sizeof(int),
cudaMemcpyHostToDevice) ;

//如果注释掉下面这句分配dev_TotalPointNumLastPicR,最后输出matchedPointNum = 0
//如果有这一句,最后输出matchedPointNum = 31199
cudaMalloc((void**)&dev_TotalPointNumLastPicR, picnumR* sizeof(int)); //这句到底怎么了??

why<<<2000,16>>>(picnumR, dev_matchPair);
cudaMemcpy(host_matchPair, dev_matchPair,
TotalPtLpicnumRsizeof(int),
cudaMemcpyDeviceToHost) ;

for (i=0;i<TotalPtL;i++)
for(j=0;j<picnumR;j++)
if (host_matchPair[j+i*picnumR]!=-1)
matchedPointNum++;
printf(“matchedPointNum = %i\n”, matchedPointNum);

free(host_matchPair);
cudaFree(dev_matchPair);
cudaFree(dev_TotalPointNumLastPicR);
}

大致目测了一下您的程序,没看出来明显的问题。虽然最前面没有cuda的头文件,不过这个估计是您没贴出来而不是没写。

建议呢,就是按照programming guide 里面Error Checking章节的方法,在每个CUDA runtime API函数后面和调用kernel的后面,检查下报错情况,看看是不是哪一步出了问题。

都是我的错 global void why(int picnum, int dev_matchPair){
int i=threadIdx.x + blockIdx.x
blockDim.x;
int j=threadIdx.y + blockIdx.yblockDim.y;
dev_matchPair[j+i
picnum]=12;
}

应该改为 global void why(int picnum, int TotalPtL, int dev_matchPair){
int i=threadIdx.x + blockIdx.x
blockDim.x;
int j=threadIdx.y + blockIdx.yblockDim.y;
if(j+i
picnum<picnumTotalPtL) dev_matchPair[j+ipicnum]=12;
}

相应的,调用部分也做修改