Udacity cs344Unit 5-Introduction to Parallel Programming笔记(超详细,CUDA,并行,GPU)

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来交流(总线接口标准)

猜你喜欢

转载自blog.csdn.net/Ria_Ria/article/details/81142200
今日推荐