cudamemcpy运行速度很慢!

I_belong_to_jesus 2015-07-30 07:31:52
编写程序
内核函数为:
__global__ void decode_one_step(int* dev_pos,u8 *r)//8176,16个block,511个id;
{
int i= blockIdx.x*blockDim.x+threadIdx.x;
u8 tmp1,tmp2,tmp3,tmp4,tmp;
if(i<8176)
{
tmp1=0;
tmp2=0;
tmp3=0;
tmp4=0;
tmp=0;
for(int m=0;m<32;m++)
{
tmp1^=r[*(dev_pos+i*128+m)];
tmp2^=r[*(dev_pos+i*128+32+m)];
tmp3^=r[*(dev_pos+i*128+64+m)];
tmp4^=r[*(dev_pos+i*128+96+m)];
}
tmp=tmp1+tmp2+tmp3+tmp4;
if(tmp>=2)
{
r[i]^=1;
}
}
}
主函数部分为:
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime,nEndTime,mid1,mid2;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);
#pragma omp parallel
{
cudaMemcpy( dev_a, a,cnt_len*8176*sizeof(u8),cudaMemcpyHostToDevice );
}
QueryPerformanceCounter(&mid1);
for(int tt=0;tt<cnt_len;tt++)
{
decode_one_step<<<16,511>>>(dev_b,(dev_a+tt*8176));
for(int ttt=0;ttt<8176;ttt++)
{
for(int jj=0;jj<32;jj++);
}
}
QueryPerformanceCounter(&mid2);
#pragma omp parallel
{
checkCudaErrors(cudaMemcpy(a,dev_a,sizeof(u8)*8176*cnt_len,cudaMemcpyDeviceToHost));
}
QueryPerformanceCounter(&nEndTime);
time=((double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart);
double time1,time2,time3;
time1=((double)(mid1.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart);
time2=((double)(mid2.QuadPart-mid1.QuadPart)/(double)nFreq.QuadPart);
time3=((double)(nEndTime.QuadPart-mid2.QuadPart)/(double)nFreq.QuadPart);
cout<<"time is "<<time*1000<<"ms "<<endl;
cout<<"the decode speed is "<<0.8176/time2<<"Mb/s"<<endl;
cout<<"拷贝数据时间:"<<time1*1000<<"ms\n"<<"程序时间"<<time2*1000<<"ms\n"<<"拷贝回来时间"<<time3*1000<<"ms"<<endl;

为什么拷贝回来的时间,也就是cudaMemcpy从设备拷贝回主机的时间特别长。
...全文
1737 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
linxxx3 2015-07-31
  • 打赏
  • 举报
回复 1
lz需要理解,核函数的执行在主机端看来是异步的。即执行kernel的语句调用完,立即返回,事实上GPU端仍在执行kernel过程中。 到第三步从设备memcpy回主机时,需要等待GPU执行的结果。所以75ms应该包括了核函数执行的时间和数据拷贝会主机的时间。 想要正确计时,需要使用event或者同步手段。
I_belong_to_jesus 2015-07-31
  • 打赏
  • 举报
回复
感谢感谢 问题确实是这样的,刚开始学cuda编程,万分感谢!
I_belong_to_jesus 2015-07-30
  • 打赏
  • 举报
回复
cudaMemcpy从主机拷贝数据到设备大概1.3ms,内核函数运行大概1ms,而memcpy从从设备拷贝数据到主机大概75ms,为什么同样的数据,从主机拷贝到设备和从设备拷贝到主机差这么多!

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧