求助:kernal 函数不能运行

由于数据量比较大,所以要循环调用kernal函数,当程序运行一段时间后,kernal 函数不能运行——罢工了!比如,我们要的结果是一个规模是1000K的float数组,每次调用kernal计算10K个元素存入该数组对应的位置中。当计算到大概700K个元素时,之后调用的kernal 函数给出的结果都是零。之前的结果是正确的。百思不得其解。求大牛拯救。

要贴 :代码+问题

[

#define numofthread 250
#define totalthread 5000
float f[10M],e[10M],fs=T;
float *AA,*ww,*PP;

global void calcuPt(float *A,float w,float P,int num,int step)
{
float real,image,thert,tmp;
shared float ww;
shared float AA[2000];
real=image=0.0f;
tmp=blockIdx.x
numofthread+threadIdx.x+1+step
totalthread;
ww=w[0];
__syncthreads();
for(int j=0;j<25;j++)
{
if(threadIdx.x==0)
{
for(int i=0;i<2000;i++)
AA[i]=A[i+j*2000];//A是global memeory规模为50000

}

__syncthreads();

for(int i=0;i<2000;i++)
{

thert=-tmpww(i+j*2000);

real=real+AA[i]*cosf(thert);

image=image+AA[i]*sinf(thert);

}
__syncthreads();
}
__syncthreads();
P[blockIdx.xnumofthread+threadIdx.x]=realreal+image*image;
}

void calPt(float *Pt,int num,int time)//time为Pt数组的规模,为1000000
{

int i=0;

dim3 dimGrid(totalthread/numofthread,1,1);
dim3 dimBlock(numofthread,1,1);

for(i=0;i<time/totalthread;i++)
{
calcuPt<<<dimGrid,dimBlock>>>(AA,ww,PP,num,i);

cudaMemcpy(&Pt[i*totalthread],PP,totalthread*sizeof(float),cudaMemcpyDeviceToHost);

}

}[/i][/i][/i]

有些地方应该是你忘记括号之类的吧?比如(1+step)等。kernel中我有一行不明白: ww=w[0];
__syncthreads();
这是什么意思?所有线程都读同一个数吗?

你700k之后数据有问题,你分配空间太少或者传递数据的时候会不会有问题呢?
你的kernel我感觉是没问题的,你可以调试一下kernel看看是什么问题。

我想问一个问题:在运行cuda程序时,显示器的显示功能是否受到影响?我的cuda程序运行时,显示器上的光标闪烁明显变慢。如果cuda程序长时间占用GPU使得显示器显示很卡,GPU会不会强行关掉我的cuda程序?
提出这个问题是因为,我对程序做了一点改动,在每次调用kernel函数后加了一个延迟语句Sleep(50);(延迟50ms 需要#include <windows.h>)程序就可以算出所有的结果。
for(i=0;i<time/totalthread;i++)
{
calcuPt<<<dimGrid,dimBlock>>>(AA,ww,PP,num,i);

cudaMemcpy(&Pt[i*totalthread],PP,totalthread*sizeof(float),cudaMemcpyDeviceToHost);
Sleep(50); //加了这个语句
}

cuda长时间占用gpu的话,显示是有问题的。很可能是这个问题。

你可以到linux下运行你的程序:1,不关闭x-server运行你的程序;2,关闭x-server,运行你的程序;如果2可以正常运行,你的结论就可以得到证实。不过,如果你的程序运行时间长的话, 结果应该是2.