我用的是 单个 stream overlap 的操作。下边是部分代码
cudaStreamCreate(&stream);
int N = 1000000; //分块大小
uint *gpuWords ,gpuH = NULL; //gpuWords 为待处理的数据
cudaMalloc((void **)&gpuWords, N64);
cudaMalloc((void **)&gpuH, 4sizeof(uint)); //结果的存放地址,所有的线程的结果 。
uint tmp[4] = {0};
cudaMemcpy(gpuH, tmp, 4sizeof(uint), cudaMemcpyHostToDevice);
int dynShmemPerThread = 64;
int staticShmemPerBlock = 32;
int tpb =128; // tpb is number of threads per block
int gridDim[3];
calculate_grid_parameters(gridDim, tpb, N, dynShmemPerThread, staticShmemPerBlock);//计算任务数为N 的block 的维度
for (int i=0 ; i < SUM; i+=N) //SUM为总任务数
{
if(SUM-i < N) //剩下的不够 分配, 重新计算block 维度
{
N=SUM-i;
calculate_grid_parameters(gridDim, tpb, N, dynShmemPerThread, staticShmemPerBlock);
}
cudaMemcpyAsync(gpuWords, &paddedWords[0+i64], N64, cudaMemcpyHostToDevice, stream);
execute_kernel(gridDim[0], gridDim[1], tpb, tpb*dynShmemPerThread, N, gpuWords, gpuH, stream, i);//, stream, i);
std::cerr<< " I =" << i << "N = " << N << “\n”;
}
cudaStreamSynchronize(stream);//cudaThreadSynchronize();
uint ret[4];
cudaMemcpy(ret, gpuHashes, sizeof(uint)*4, cudaMemcpyDeviceToHost); //结果copy 会主机
出现段错误的 stack[attach]3280[/attach]
cudaMemcpyAsync中 的 paddedWords 我在主机内存中 用malloc 和 mallocHostAlloc 都尝试过,对100+M 数据都运行成功 ,都与 500M 的数据运行,都会出现下边的错误。
这样分块 overlap 是因为我的显存不够一次存放。
这样我运行 数据量小的数据的时候 100+M ,运行成功。
但是当我运行 500+M 的数据的时候,就不成功(当我一次将500M 的数据装入显存来处理可以处理成功)
本该 ,500M 的数据 运行到 i = 67 000 000 ,N =108864
可是,我的运行结果是 i=33 000 000 , N =1 000 000,就出现了段错误。(我想前边的都一样,出错也该到结尾出错呀)
于是,我想是不是 对overlap 登录的kernel 或者 thread 有要求么?
不知道 ,那为能给点意见。。为什么在这或出现段错误呢? 我该这么找到这个原因?
为什么会在这边出错了?