GPU中基于CUDA计算SM中active block和active warp及普遍优化流程

CUDA优化涉及设计合适的block和thread dimension,确保active block和active warp充分利用。优化要点包括:准确平衡精度与计算量,减少延迟,优化计算和IO。优化标准包括保持计算复杂度,确保active warp能让SM满载,以及active block大于2以隐藏访存延迟。优化步骤包括确定串行并行部分,选择算法,优化数据划分,优化显存访问,调整指令流,资源均衡,减少register使用,以及高效处理device与host通信。测试时间的方法包括设备端和主机端测量,注意异步函数的影响。最后,应关注bank conflict,使用共享存储器,纹理存储器和常数存储器,并优化指令流以提高吞吐量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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与host通信:尽量减少CPU与GPU间的传输:使用cudaMallocHost分配主机端存储器,可以获得更大带宽;一次缓存较多的数据后再一次传输,可以获得较高的贷款;需要将结果显示到屏幕的时候,直接使用与图形学API互操作的功能;使用流和异步处理隐藏与主机的通信时间;使用zero-memory技术和Write-Combined memory提高可用带宽。
测试时间的方法:
CUDA内核程序的运行时间:可以在设备端测量,也可以在主机端测量;
设备端测量时间:调用clock()函数:返回的是GPU的时钟周期,需要除以GPU的运行频率才能得到以秒为单位的时间;
主机端测量时间:使用c标准库中的clock_t()函数测试,由于其精度很低,因此应该运行多次然后求平均运行时间;注意异步函数(比如内核函数和带有asyn后缀的存储器拷贝函数),在GPU上执行完成之前,CPU线程已经得到了它的返回值;从主机测量一系列CUDA调用需要的时间的时候,要首先调用cudaThreadSynchr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值