数据存储到cache中遇到的问题,详解cache、寄存器、cpu、内存之间的关系

问题起因:

公司的一个处理图像的程序得到的结果中,图像是漏点的。(大量像素点位的RGB值错误)

 

分析原因:

1、元素点的值(RGB)计算错误?

  1. 计算元素值的算法出错
  2. 计算结果没有更新

2、通过测试发现不是1)的问题,所以就应该是2),查找数据更新节点,发现确实计算结果正确,程序执行结束,应该更新完成了(按照道理来说,赋值之后就应该更新,但是最后的输出结果却没更新),经过调研发现数据存储位置的不同,更新机制就不同。(数据存储一般存储在内存或者cache中,问题的原因就是因为数据存储到cache中了,程序运行结束前没有进行sync)

 

分析后的问题延伸:

1、cache物理结构及物理地址:SRAM为主体的存储器,也是一种内存,只是被集成到CPU上了。

数据存储到cache中遇到的问题,详解cache、寄存器、cpu、内存之间的关系_第1张图片

 

 

2、存储速度是内存的60倍,接近寄存器的速度(稍慢不到1ns)。

 

数据存储到cache中遇到的问题,详解cache、寄存器、cpu、内存之间的关系_第2张图片

 

3、cache数据的更新机制

 

  1. cpu快速读取大量数据的时候,新数据覆盖旧数据。

 

  1. Cache 替换算法和写策略:简单来说就是每一个数据块都有一个计数器,当某一个数据块被使用的时候,这个数据块的计数器被清零,其他数据块的计数器加1,当需要替换的时候淘汰计数器值最大的数据块。

数据存储到cache中遇到的问题,详解cache、寄存器、cpu、内存之间的关系_第3张图片

 

 

4、因为Cache 中的内容是主存块副本,当对 Cache 中的内容进行更新时,就存在 Cache 和主存如何保持一致的问题。(答案:https://www.jianshu.com/p/39b75482c0ed

 

  1. 当多个设备都允许访问主存时,例如:I/O 设备可直接读写内存时,如果Cache 中的内容被修改,则 I/O 设备读出的对应主存单元的内容无效;若 I/O 设备修改了主存单元的内容,则Cache 中对应的内容无效。

 

  1. 当多个 CPU 都带有各自的 Cache 而共享主存时某个 CPU 修改了自身 Cache 中的内容,则对应的主存单元和其他 CPU 中对应的内容都变为无效。

 

  1. 写操作也有两种情况:
    1. 写命中(Write Hit):要写的单元已经在 Cache 中
    2. 写不命中(Write Miss):要写的单元不在 Cache 中

 

  1. 最后解释一下之间说的:“no-cache其实指的就是具有写直达的cache,这个概念我在网上没搜索到,但是按照理解就是这个样子的,在http协议中的no-cache值的是接收这个缓存数据要进行验证)

 

解决方案:

1、直接在程序结尾,添加指令。cache一致性的维护由硬件CPU自动完成,同时处理器也会提供一些指令,以支持软件对cache的操作。以x86为例,有四条指令可以对cache进行invalidate/flush.

1、全部invaliate/flush

WBINVD, 即write back invalidate的缩写,具体操作是先将cache中标记为modified的内容全部write back到外部内存,再清空整个cache。INVD, 相比WBINVD少了个write back的操作,所以没法保证数据一致性,这条指令只在cache和外部内存不需要保持一致的情况下使用(如某些测试环境)。

2、部分invalidate/flush

CLFLUSH/CLFLUSHOPT,即cache line flush的缩写,可针对某些cache lines单独操作,适用于该cache line对应的内存区域之后不会再被访问(access)到的情况。

 

2、将数据存储到内存中。

 

附上本人绘制的cache、寄存器、cpu、内存之间的关系脑图,如果你有所收获希望大家看完能给我的脑图点个赞谢谢!!!

https://www.processon.com/view/link/6038cc331e085364c6761ffb

 

你可能感兴趣的:(计算机硬件结构,cpu,寄存器,储存器)