CUDA优化

CUDA优化

The method of CUDA to improve performance:

1.block size to increase occupancy
2.对其和合并 increase the 内存事物使用率.
3.减少分支化
4.展开 unrolling(一般是最有效的方法)
5.尽量使用共享内存,但要避免共享内存的冲突(正确使用共享内存)

可扩展性

可扩展性也是很重要的,即增加GPU数量,性能也有较大幅度或成倍数提升。

验证

验证也是很重要的,优化过程是多种因素综合考虑的结果,较为复杂,程序很容易就
发生错误,而且很难查找,所以建议在程序执行完成后在后面跟CPU做一个数据验证。保证每一步优化都正确。

The evaluation norms:

1.Occupancy:

nvprof –metrics achieved_occupancy ./a.out // evaluate the occupancy
/*
* This norm can guide us adjust the kernel’s block-size. The purpose of adjust the block-size is
* obtaining as much as possible occupancy.(提高占用率是为了提高吞吐量,即有更多的活跃的线程隐
* 藏延迟)
* 调整块大小的依据是:
* 1.32倍数
* 2.共享内存和寄存器占用大小 (查看共享内存和寄存器数量指令:
* 3.一个SM可以放多少个块
* 4.一个SM最多有多少个线程
*/

2.Global memory:

nvprof –metrics gld_throughput ./a.out // evaluate the global memory load bandwidth(throughput)

nvprof –metrics gst_throughput ./a.out // evaluate the global memory store bandwidth(throughput)

nvprof –metrics gld_efficiency ./a.out // evaluate the global memory load efficiency

nvprof –metrics gst_ efficiency ./a.out // evaluate the global memory store efficiency

/*
* This norm reflected our global memory’s bandwidth and efficiency.
* 调整此指标的依据是:尽量保证对全局内存的存和取成对齐和合并方式
* 以线程束为考虑的单元:
* 对齐:线程束请求的内存大小是缓存颗粒长度的整倍数,且没有偏移(较难,较为特殊)
* 对齐书上定义:如果内存访问的第一个地址是32字节的倍数,则对齐加载。
* 合并:线程束请求的内存映射在一维的全局内存上是连续的。
*/

3.Branch:

nvprof –metrics branch_efficiency //分支效率
nvprof –event branch,divergent_branch //分支和分支时间计数器个数

/*
* 避免分支化的一种同用方法是:线程束方法,即分支颗粒是线程束大小的倍数。
*/

4.Unrolling:

nvprof –metrics dram_read_throughput ./a.out // evaluate the device memory read throughput(bandwidth)

展开的主要思想是:增加在一个线程上独立处理数据的个数,从而增加在一个线程上独立的内存事物的个数,从而增加内存的读和写的效率,所以会增加设备内存的带宽,所以用dram_read_throughput 来描述这以方法所带来的性能改变。另外,因为增加了一个线程上处理数据的个数,所以网格的大小也要相应的变小,因为单线程处理了多数据,不需要全部每个数据占一个线程了。

5.Share memory:

nvprof –metrics shared_load_transaction_per_requset //共享加载的任务调用内存存储体的请求数,为1为最优,即共享内存的加载只请求了一次内存存储体。
nvprof –metrics shared_store_transaction_per_requset //共享存储的任务调用内存存储体的请求数,为1为最优,即共享内存的存储只请求了一次内存存储体。

共享内存使用的关键是减少或避免内存存储体冲突。
方法是填充共享内存。
共享内存的作用是当有交错或乱序(效率极低的内存访问方式)读或写全局内存的请求时,申请共享内存,在尽量避免内存体冲突的前提下,把复杂的访问放到共享内存中,因为共享内存的读写方式是32个内存存储体,它在处理复杂请求时是有优势的(但也有较高的难度,较高的错误风险)。如图像卷积操作时,只要通过填充把要访问的数据分布到不同的存储体上。

0 0 0 1 0 0 0
0 0 1 1 1 0 0 –> 填充两列
0 0 0 1 0 0 0

0 0 0 1 0 0 0
0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 1 0 0 0

6.Others

nvprof –metrics inst_per_warp ./a.out // evaluate the executed instructions per warp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值