文字搜索只得出第一次循环的结果,以后的循环得到的结果全为零,为啥?

在做文字搜索,模拟从一个大文本文件中搜索特定文字,但暂时还没学多线程,就把文件分成了多份想通过不断循环从文本中拷贝数据到显存,然后再搜索显存中的数据,从显存得出与之相同的文字的个数,但是搜索结果只是第一次循环在显存中计算的结果,第二次以后得到的结果全是0,这是为什么呢?而且在以后的循环如第12次,13次还会出现未知错误,是什么原因呢?是第一次循环中的数据或结果对以后的循环有影响吗?下面是部分代码:
if(thread>0){//thread是要循环的次数,每次循环都处理THREADS个以“。”为标志的中文句子
for(num[1]=0;num[1]<thread;num[1]++){
a=THREADS*(num[1]+1);
b=THREADSnum[1];
num[2]=THREADS;//拷贝到显存的句子数目
txt=(char
)malloc((fp[a]-fp[b])sizeof(char));
result=(int
)calloc(THREADS,sizeof(int));
if((fp1=fopen(“1.txt”,“rb”))==NULL){
printf(“file open error!\n”);
exit(0);
}
else printf(“file open success!\n”);
fseek(fp1,fp[b],0);
fread(txt,sizeof(char),fp[a]-fp[b],fp1);
fclose(fp1);
CUDA_SAFE_CALL(cudaMalloc((void **)&g_txt1,sizeof(char)*(fp[a]-fp[b])));
CUDA_SAFE_CALL(cudaMalloc((void **)&g_fp1,sizeof(unsigned long)*200000));
CUDA_SAFE_CALL(cudaMalloc((void **)&g_words1,sizeof(char)*21));
CUDA_SAFE_CALL(cudaMalloc((void **)&g_num,sizeof(int)*3));
CUDA_SAFE_CALL(cudaMalloc((void **)&g_result,sizeof(int)THREADS));
CUDA_SAFE_CALL(cudaMemcpy(g_txt1,txt,sizeof(char)
(fp[a]-fp[b]),cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(g_fp1,fp,sizeof(unsigned long)*200000,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(g_words1,words,sizeof(char)*21,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(g_num,num,sizeof(int)*3,cudaMemcpyHostToDevice));
findstr<<<1,THREADS,0>>>(g_txt1,g_fp1,g_words1,g_num,g_result);
CUDA_SAFE_CALL(cudaMemcpy(result,g_result,sizeof(int)*THREADS,cudaMemcpyDeviceToHost));
cudaFree(g_txt1);
cudaFree(g_fp1);
cudaFree(g_words1);
cudaFree(g_num);
cudaFree(g_result);
free(txt);

for(h=0;h<THREADS;h++){
sum+=result[h];
if(result[h]!=0)
}
free(result);
}
}
内核代码:
global void findstr(char *g_txt,unsigned long *g_fp,char *g_words,int *g_num,int *g_result){
int i=0;
unsigned long a;
int b=0,e=0;
unsigned long c,d;
const int tid=threadIdx.x;
if(tid<g_num[2]){
c=g_num[1]*THREADS+tid; d=g_num[1]*THREADS+tid+1;
for(a=g_fp[c]+1;a<=g_fp[d];a++){
if(g_txt[a]==g_words[b]){e++;b++;
if(b==g_num[0]){i++;b=0;e=0;}
}
else{if(e>0){a=a-e+1;e=0;b=0;}}
}
}
g_result[tid]=i;
}