冯诺依曼模型
中央处理器cpu:
负责数据计算,里面有寄存器,L1 cache,L2 cache,L3 cache等高速缓存。
内存: 从硬盘中加载数据,并通过与cpu通信传送数据。
输入输出设备: 输入输出设备可以通过数据总线直接与cpu进行通信,按下键盘是输入操作,显示到屏幕是输出操作
总线: 内存,cpu, 输入输出设备之间是通过总线的连接从而进行彼此之间的通信的
cpu缓存
cpu有自己的缓存机制,当一个数据多次被用到的时候能够缓存对应的指令数据,所以应该代码优化层次上面可以将多个运行一致的代码放在一起,这样有利于cpu缓存命中率的提升,从而提升程序的运行速度。
上述两种类型的赋值相对来说形式二的数独要快一些,因为cpu缓存从内存中取数据不是一个一个取得,而是每次以cache line大小进行获取的,当N比较大的时候,array[j][i]的数据其实已经很难从缓存中取到,但是array[i][j]因为是从数组的连续部分取数据,所以很容易从上一个已经加载的cache line中获取得到。
CPU伪共享
现在的系统一般都是多核cpu,当多个任务同时运行的时候就会形成共享cache line,会出现cache line失效的情况。
如下图所示:
a和b在内存中的地址相邻,由于cache从内存中一次性加载cpu line个单位的数据(一般是64字节),所以两个cpu cache中会同时存在a,b两个,由于两个cpu都读取了内存变量a和b,所以此时两个cache line的状态都是共享状态,当cpu1去修改a的值的时候,由于存在共享cache line,所以会将另外一个cache line的状态置为失效状态,然后将自己的cache line的状态修改为已修改装填,同时修改值。当cpu2去修改b值的时候,发现自己的cache line已经是失效状态,同时存在一个共享的cache line的状态为已修改状态,会把cpu1的值同步到内存,然后将内存中的值同步到cpu2的cache line中,进而cpu2才可以进一步去修改b的值,这种多个cpu共享cache line的状态就是伪共享,伪共享由于同时修改读取对应cache line的变量的时候存在相互影响,因此性能上也会受到一定的影响。