CUDA程序优化

CUDA程序优化中,cudaMemcpyAsync函数用于异步数据传输,能实现GPU与CPU同步。通过实验,发现4帧数据传输可达到带宽峰值,因此可以开5个流,每次传输4帧并同时计算,从而提高运行速度,实现计算与传输的并行,有效减少程序执行时间。
摘要由CSDN通过智能技术生成
     CUDA的程序优化主要分为算法优化和访存优化。算法方面的优化主要要看具体代码以及主要想完成的功能,今天主要讨论下访存的优化。

    访存主要用到的函数主要是cudaMemcpy函数。通过多次试验,发现该函数是这样工作的,首先要看我们传递多少数据量,根据数据量来决定传输过程中占用多少带宽。也就是说,在未达到带宽上限的时候,传递的速度是一样的。曾做过试验,传递10个int数据和传递100个int数据所用时间是相同的。所以,要想保证拷贝数据的时候速度最快,就要保证传输带宽达到峰值。但是,这也并不是说所有数据一次传完这样的速度最快,所以我们经常使用cudaMemcpyAsync函数。这个函数的特点就是刚一执行就立即返回,这样就可以一边传递数据,一边进行下一步的操作,常用来进行GPU与CPU的同步。但是,有时与GPU同步的CPU要用到GPU中的数据,这样就要用线程同步函数,在GPU中所有线程都完成运算时,再进行下一步的计算。当然,GPU函数和GPU函数也是可以通过异步操作来提升运行时间的。这就要用到流的概念。

    假若我们要拷贝20帧的数据从内存到显存,然后计算,再将结果返回,正常写法应该是

   cudaMemcpy(内存到显存);

   GPUFunc();

   cudaMemcpy(显存到内存);

    这样的写法就十分浪费时间。通过实验我们可以知道4帧图像的数据一起传输就可以达到传输带宽的峰值,这样我们就可以开5个流,每次传递4帧数据。 

for(i = 0;i < 5; i++)

{ </

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值