1.优化的等级
2.应该有一个系统化的优化过程(类似于一个优化的周期,缺少哪一步效果都不好)
在真实数据集上跑很重要
不要“真空”优化
别忘了
思考你到底想实现啥
和在现实世界中执行收到反馈
3.具体过程
a.分析
4.强缩放和弱缩放
弱缩放:时间不变,问题数量增多
强缩放:问题不变,时间缩短
5.分析
了解热点
Amdah's law
6.并行化
用GPU做矩阵转置
分配空间调用
但是
计时
扩大问题规模
这有一个值不值得优化的问题
466ms是相当的慢了,但是如果这段程序只在你的整体中执行一次或者规模极小,比如第一次例子中的8*8矩阵,就犯不上优化了
优化:
刚刚是对整个矩阵只启用一个线程
现在对每一行启动一个线程
n是矩阵的行列数
留作业:按照每个元素启用一个线程
注意
你看都是 Idx. 只是 . 后面的在改变 x或者y,什么时候需要Idy?应该是启动了二维线程块的时候?没有Idy吧!
k是在线程块中,每行每列启动了多少线程
N/K 是每行每列启动了多少线程块
调用的时候是放进了两个dim3类型的变量,分别指定了每个grid用多少个线程块,和每个线程块用多少个thread
分析一下子
1024*1024个元素
每个元素4个字节
读一次写一次,共2次
一共用了0367*10的3次秒
总量除以时间等于效率(带宽)
7.
看读与写 内存的距离
(传一张自己画的图)
确实,读是按照方矩阵从左到右的方向读的,那怎么能保证线程跑过去读内存的顺序?是并发无序执行的,还是说本质其实有一定顺序?
写的时候是按照方矩阵从上到下写的,当然与内存存储的顺序不一致,会很分散,但是疑问同上
还是说这个是针对CPU读取内存来说的??
好像是CPU,翻一下前面的参数部分
还是对全局内存来说的??
线程访问全局内存时候有没有顺序
8.
刚刚做的用时间来找到优化的点,是很原始的,现在有专门的插件来帮你分析
工具只是用来帮助你分析,给你一些指导性意见
???
在关注为啥内存利用率变小之前,来看一个原则
Little 原则
(自己的 图)
把内存比作管道
就是怎么能把管道填满:1)加大线程数,2)加大每个线程的数据量
以下是方法2)(但是这属于忍者优化,在边缘了,先不太深入探讨,讨论一种大众的)
运行的进程太少造成的利用率不足的情况:
大部分线程等待时间长:
怎样降低等待时间
一个SM中能包含很多个块,但不可能无穷吧,什么在限制??
先看另一个问题
占用率(occupancy)
限制一.
限制二.
限制三.
限制四.
可查看内核占用率的工具
优化计算性能
第一个方法的示例就是上面那个
warp是命令执行的一个单位
在分支结构中线程是咋运行的
红线程和蓝线程是交错运行的
测验 取余 %
再一个练习 除法 /
循环
(自己图)
分支分散
GPU编程原则!!
1.试着避免分支代码(分支和循环)
2.避免线程负载出现大的不平衡(注意循环和递归)
广度优先搜索
每个线程会被随机的分配工作项(work items)
为了保证不会有一个倒霉蛋分到贼大的 工作量,以至于别人都等他
我们需要优化
各种数学优化
1.在你真的需要的时候再用双精度,因为很慢
2.用原来就给你预备好的函数,会很快
谈谈整个系统级的优化
包括主机和GPU之间的互动
在大多数机器上,CPU和GPU在不同的芯片上
他们通过PCIe来交流(总线接口标准)