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++)
{ </