問題起因:
公司的一個處理影像的程式得到的結果中,影像是漏點的,(大量像素點位的RGB值錯誤)
分析原因:
1、元素點的值(RGB)計算錯誤?
- 計算元素值的演算法出錯
- 計算結果沒有更新
2、通過測驗發現不是1)的問題,所以就應該是2),查找資料更新節點,發現確實計算結果正確,程式執行結束,應該更新完成了(按照道理來說,賦值之后就應該更新,但是最后的輸出結果卻沒更新),經過調研發現資料存盤位置的不同,更新機制就不同,(資料存盤一般存盤在記憶體或者cache中,問題的原因就是因為資料存盤到cache中了,程式運行結束前沒有進行sync)
分析后的問題延伸:
1、cache物理結構及物理地址:SRAM為主體的存盤器,也是一種記憶體,只是被集成到CPU上了,

2、存盤速度是記憶體的60倍,接近暫存器的速度(稍慢不到1ns),

3、cache資料的更新機制
- cpu快速讀取大量資料的時候,新資料覆寫舊資料,
- Cache 替換演算法和寫策略:簡單來說就是每一個資料塊都有一個計數器,當某一個資料塊被使用的時候,這個資料塊的計數器被清零,其他資料塊的計數器加1,當需要替換的時候淘汰計數器值最大的資料塊,

4、因為Cache 中的內容是主存塊副本,當對 Cache 中的內容進行更新時,就存在 Cache 和主存如何保持一致的問題,(答案:https://www.jianshu.com/p/39b75482c0ed)
- 當多個設備都允許訪問主存時,例如:I/O 設備可直接讀寫記憶體時,如果Cache 中的內容被修改,則 I/O 設備讀出的對應主存單元的內容無效;若 I/O 設備修改了主存單元的內容,則Cache 中對應的內容無效,
- 當多個 CPU 都帶有各自的 Cache 而共享主存時某個 CPU 修改了自身 Cache 中的內容,則對應的主存單元和其他 CPU 中對應的內容都變為無效,
- 寫操作也有兩種情況:
- 寫命中(Write Hit):要寫的單元已經在 Cache 中
- 寫不命中(Write Miss):要寫的單元不在 Cache 中
- 最后解釋一下之間說的:“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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264262.html
標籤:其他
