优化背景
总的来说和计算机的设计相关
[!note] 计算机设计的简单了解
计算机和计算相关的硬件和系统主要有:
- 中央处理器(CPU)
- 内存
- 硬件并行设计
Ps:之前在新生研讨课的时候听老师提到GPU处理简单计算是比cpu要快的,那么是否可以有指令让程序在GPU上面进行计算(亦或者说,程序本身就会在GPU上面运行?)这一点还没搞懂
CPU:【用于计算和控制的计算机大脑】
对于做题而言,CPU里面最重要的设计就是缓存(cahe)
缓存就相当于是一个临时储存,起数据临时存放和调用的作用,它的特点是(空间)小型(读取速度)快速
缓存能够减少因数据多次从主存中读取而大大增加的时间,对于需要重复使用的数据来说,缓存是它们最好的归宿
gihub上的优化方法中的拆开循环,一次计算1*
4(或者4*
4)可能的目的就是去贴近缓存空间大小,减少缓存未命中【这个又和缓存的设计有关系】>Ps:之前偶然碰见并使用的交换循环的方法就是去靠近缓存的设计【当时直接倍率上到了6,开心死,可惜没有进一步优化的空间(也可能是我太菜,看不出来,哈哈)】
内存系统:【存放数据的仓库】
对于做题而言,只需要知道,数据从主存中读取的速度相较于从缓存中读取慢上很多,因此数据尽量从缓存中读取
但是我们又不是计算机,怎么能控制数据从哪个地方读取呢?【思考ing】
反正我现在不知道
我们知道【其实是我推测的,这个具体的过程我还没去了解】,数据是先从主存中读取,然后储存在缓存中。CPU读取数据先从缓存中读取,若未读取到,则会再次从主存中搜索获取【此过程成为“缓存命中】硬件并行设计:
主要分为多线程和多进程
分别对应mpi与omp多进程与多线程
omp和mpi适用的计算机内存模型不一样【详见《并行程序设计导论》】
mpi相当于是把任务均分【理想是均分】给多个内存空间,然后同时计算,最后等所有计算完成后,将计算结果汇总计算,最终得到最后的结果
对于单台计算机而言,我认为mpi的作用是精细分配任务,最大限度释放计算机性能
【不过原理是明白了,但是还是操作不起来,哈哈哈】
omp相当于是…..
【哦~,对omp和mpi的理解还不太行】SIMD & MIM
单指令多数据和多指令多数据并行计算模式【目前看到这个地方,后面由于时间原因就没有深入了解了】
gihub上最终的优化方案总重要的一步就是使用了SSE(即是SIMD命名)
【当然,前面的循环展开,寄存器的使用等等都是有用的】
循环展开、一次优化1*
4或者4*
4、寄存器【临时储存变量】都和上述原因相关
所以,要对并行计算领域进行探索,对计算机系统也必须要有较好的理解!