cache快取與偽共享

2022-09-16 11:12:12 字數 1010 閱讀 9021

一、cache快取

cache與主存之間是以塊為單位讀寫的,這樣設計是為了符合程式執行的區域性性原理--時間區域性性原理與空間區域性性原理(參見《計算機組成原理》)

二維陣列行遍歷比列遍歷要快,是由於二維陣列是按行儲存的,cache從主存中讀入塊,會將同行相鄰元素一起寫入cache,導致行遍歷cache命中率大於列遍歷cache命中率。

public

class

cachetest

}long endtime =system.currenttimemillis();

long cachetime = endtime -starttime;

system.out.println("cache time :" +cachetime);

starttime =system.currenttimemillis();

for (int j = 0; j < column_num; j++)

}endtime =system.currenttimemillis();

system.out.println("no cache time :" + (endtime -starttime));

}}

二、偽共享

偽共享:當乙個cache行中有多個變數,多執行緒不能同時修改更新這多個變數。導致多執行緒的序列執行

/*

* 解決偽共享方法一:cache行為64b,物件頭8b,加上變數8b,加上填充的6個無用變數48b,達到乙個cache行對應乙個變數

**/public

final

static

class

filedlong

/** 解決偽共享方法二:sun.misc.contended註解

**/@contended

public

final

static

class

filedlong2

cpu快取偽共享

描述 引數 返回值 建立人 yufeng.lin ucarinc.com 建立時間 修改人和其它資訊 public class fadeshare implements runnable public fadeshare int i 設計4個執行緒,執行同乙個計算量 計算前後時間 param arg...

共享與偽共享

共享就是乙個記憶體區域的資料被多個處理器訪問,偽共享就是不是真的共享。這裡的共享這個概念是基於邏輯層面的。實際上偽共享與共享在cache line 上實際都是共享的。cpu訪問的資料都是從cache line 中讀取的。如果cpu 在cache 中找不到需要的變數,則稱快取未命中。未命中時,需要通過...

Cache一致性協議與偽共享問題

在說偽共享問題之前,有必要聊一聊什麼是cache一致性協議 時間區域性性 如果乙個資訊項正在被訪問,那麼在近期它很可能還會被再次訪問 比如迴圈 方法的反覆呼叫等 空間區域性性 如果乙個儲存器的位置被引用,那麼將來他附近的位置也會被引用 比如順序結構 陣列 cpu在摩爾定律的指導下以每18個月翻一番的...