CUDA优化第一要义是设计block和thread的dimension,这时active block和active warp就必须要考虑了。(一维的同学请回避谢谢)
首先通俗地讲一些CUDA优化的常识吧
accurancy:只在关键步骤使用双精度,其他部分仍然使用单精度浮点以获得指令吞吐量和精度的平衡;建议将双精度放在CPU里计算。异构并行会给项目加分哦
latency:降低延迟需要考虑缓冲,考虑进程间通信,block之间等待响应的时间。还有CPU与GPU之间的消息传输,等待。
calculation:计算量太小的程序使用CUDA很不合算;当需要计算的问题的计算密集度很低的时候,执行计算的时间远远比IO花费的时间短,整个程序的瓶颈出现在PCI-E带宽上。
一些优化的标准:
(1)由于是在现有的算法上进行重构,最终的计算复杂度应不明显高于最优的算法;
(2)Active warp的数量能够让SM满载,并且active block的数量大于2,能够有效地隐藏访存延迟(一个block负责访存等非计算操作一个负责并行计算)
(3)当瓶颈出现在运算指令时,指令流的效率已经过了充分优化;
当瓶颈出现在访问IO时,程序已经选用了恰当的存储器来储存数据,并使用了适当的存储器访问方式,以获得最大带宽;
当然,高水平的优化都是在算法层面做文章的。
那么就总结一下面对一个有待优化的工程时所需要做的步骤吧。一步一步详细说:
确定任务中的串行和并行的部分,选择合适的算法;
按照算法确定数据和任务的划分方式,将每个需要实现的步骤映射为一个满足CUDA两层并行模型的内核函数,让每个SM上至少有6个活动warp和至少2个活动block;
优化显存访问:合并采用相同block和grid的kernel;尽力避免将线程私有变量分配到local memory;
优化指令流:在误差可接受的情况下,使用CUDA算术指令集中的快速指令;避免多余的同步;在只需要少量线程进行操作的情况下,使用类似“if threaded<N”的方式,避免多个线程同时运行占用更长时间或者产生错误结果;
资源均衡:调整每个线程处理的数据量,shared memory和register和使用量;通过调整block大小,修改算法和指令以及动态分配shared memory,都可以提高shared memory的使用效率,这是很大的一点;register的多少是由内核程序中使用寄存器最多的时刻的用量决定的,因此减小register的使用相对困难;
节约register方法:使用shared memory存储变量;使用括号明确地表示每个变量的生存周期;使用占用寄存器较小的等效指令代替原有指令(我没试过);
对global来说,free可不是最好的方法,能接着用来存储数据就拿去存储数据吧。毕竟free完了再load会花费不必要的时间。
device与hos
GPU中基于CUDA计算SM中active block和active warp及普遍优化流程
最新推荐文章于 2024-04-28 12:21:08 发布
CUDA优化涉及设计合适的block和thread dimension,确保active block和active warp充分利用。优化要点包括:准确平衡精度与计算量,减少延迟,优化计算和IO。优化标准包括保持计算复杂度,确保active warp能让SM满载,以及active block大于2以隐藏访存延迟。优化步骤包括确定串行并行部分,选择算法,优化数据划分,优化显存访问,调整指令流,资源均衡,减少register使用,以及高效处理device与host通信。测试时间的方法包括设备端和主机端测量,注意异步函数的影响。最后,应关注bank conflict,使用共享存储器,纹理存储器和常数存储器,并优化指令流以提高吞吐量。
摘要由CSDN通过智能技术生成