【CUDA】设计优秀的CUDA程序


首先需要对我们的程序进行性能测试:
(1)时间:使用CUDA事件的方式进行时间测试。
(2)内存带宽:根据运行时间和传入到核函数的数据内存量进行带宽计算。


优秀的CUDA程序:
1. 在给定的数据规模下,选用算法的复杂度不明显高于最优的算法。
2. Active wrap(激活的线程束)的数量能够让SM载满,而且Active block的数量大于2,能够有效的隐藏访存延迟(使用足够大的内存带宽)。
3. 当瓶颈出现在运算指令时,指令流的效率已经过了充分优化。
4.当瓶颈出现在访问IO时,程序已经选用了恰当的存储器来储存数据,并使用了适当的存储器访问方式,以获得最大带宽。


CUDA程序编写优化步骤:
1.确定任务中的串行和并行部分,选择合适的算法。
2.按照算法确定数据和任务的划分形式,将每个需要实现的步骤映射为一个满足CUDA两层并行模型的内核函数,让每个SM上至少有6个活动warp和至少2个活动block。
3.编写一个能正确运行的程序作为优化的起点,要确保程序能稳定运行以及其正确性,在精度不足或者发生溢出时必须使用双精度浮点或者更长的整数类型。
4.优化显存访问,避免显存带宽成为瓶颈。在显存带宽得到完全优化前,其他优化不会产生明显效果。
5.优化指令流,在误差可接受的情况下,使用CUDA算术指令集中的快速指令;避免多余的同步;在只需要少量线程进行操作的情况下,使用类似if threaded<N的方式,避免多个线程同时运行占用更长时间或者产生错误结果。
6.资源均衡,调整每个线程处理的数据量,shared memory和register和使用量;通过调整block大小,修改算法和指令以及动态分配shared memory,都可以提高shared的使用效率;register的多少是由内核程序中使用寄存器最多的时刻的用量决定的,因此减小register的使用相对困难;节约register方法是使用shared memory存储变量;使用括号明确地表示每个变量的生存周期;使用占用寄存器较小的等效指令代替原有指令。
7.与主机通信优化,尽量减少CPU与GPU间的传输,使用cudaMallocHost分配主机端存储器,可以获得更大带宽;一次缓存较多的数据后再一次传输,可以获得较高的带宽;需要将结果显示到屏幕的时候,直接使用与图形学API互操作的功能;使用流和异步处理隐藏与主机的通信时间;使用zero-memory技术和Write-Combined memory提高可用带宽。

在显存带宽得到完全优化前,其他优化不会产生明显效果。

参考文献:
CUDA编程(三)评估CUDA程序的表现
CUDA低占用率下性能优化

猜你喜欢

转载自blog.csdn.net/TwT520Ly/article/details/81119089
今日推荐