国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CPU Cache偽共享問(wèn)題

程序喵大人 ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2022-12-12 09:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

先看下這兩段代碼:

代碼段1:

const int row = 10240;
const int col = 10240;
int matrix[row][col];
int TestRow() {
  //按行遍歷
  int sum_row = 0;
  for (int r = 0; r < row; r++) {
    for (int c = 0; c < col; c++) {
      sum_row += matrix[r][c];
    }
  }
  return sum_row;
}

代碼段2:

int TestCol() {
  //按列遍歷
  int sum_col = 0;
  for (int c = 0; c < col; c++) {
    for (int r = 0; r < row; r++) {
      sum_col += matrix[r][c];
    }
  }
  return sum_col;
}

兩段代碼的目的相同,都是為了計(jì)算矩陣中所有元素的總和。

但有些區(qū)別:一個(gè)是按行遍歷元素做計(jì)算,一個(gè)是按列遍歷元素做計(jì)算。

它倆的運(yùn)行速度有什么區(qū)別嗎?

如圖:

圖中可以看到,行遍歷的代碼速度比列遍歷的代碼速度快很多。

為什么按行遍歷的代碼比按列遍歷的代碼速度快?這里就是CPU Cache在起作用。

什么是CPU Cache?

可以先看下這個(gè)存儲(chǔ)器相關(guān)的金字塔圖:

從下到上,空間雖然越來(lái)越小,但是處理速度越來(lái)越快,相應(yīng)的,設(shè)備價(jià)格也越來(lái)越貴。

圖中的寄存器和主存估計(jì)大家都知道,那中間的L1 、L2、L3是什么?它們起到了什么作用?

它們就是CPU 的Cache,如下圖:

可以理解為CPU Cache就是CPU與主存之間的橋梁。

當(dāng)CPU想要訪問(wèn)主存中的元素時(shí),會(huì)先查看Cache中是否存在,如果存在(稱為Cache Hit),直接從Cache中獲取,如果不存在(稱為Cache Miss),才會(huì)從主存中獲取。Cache的處理速度比主存快得多。

所以,如果每次訪問(wèn)數(shù)據(jù)時(shí),都能直接從Cache中獲取,整個(gè)程序的性能肯定會(huì)更高。

那,如何提高CPU Cache的命中率?

但CPU Cache這里還有個(gè)小問(wèn)題,看下這兩段代碼:

代碼段1:

struct Point {
  std::atomic x;
  // char a[128];
  std::atomic y;
};
void Test() {
  Point point;
  std::thread t1(
      [](Point *point) {
        for (int i = 0; i < 100000000; ++i) {
          point->x += 1;
        }
      },
      &point);
  std::thread t2(
      [](Point *point) {
        for (int i = 0; i < 100000000; ++i) {
          point->y += 1;
        }
      },
      &point);
  t1.join();
  t2.join();
}

代碼段2:

struct Point {
  std::atomic x;
  char a[128];
  std::atomic y;
};
void Test() {
  Point point;
  std::thread t1(
      [](Point *point) {
        for (int i = 0; i < 100000000; ++i) {
          point->x += 1;
        }
      },
      &point);
  std::thread t2(
      [](Point *point) {
        for (int i = 0; i < 100000000; ++i) {
          point->y += 1;
        }
      },
      &point);
  t1.join();
  t2.join();
}

兩端代碼的核心邏輯都是對(duì)Point結(jié)構(gòu)體中的x和y不停+1。只有一點(diǎn)區(qū)別就是在中間塞了128字節(jié)的數(shù)組。

它們的執(zhí)行速度卻相差很大。

帶128的比不帶128的代碼,執(zhí)行速度快很多。

為什么?

看過(guò)我上面文章的同學(xué)應(yīng)該就知道,每個(gè)CPU都有自己的L1和L2 Cache,而Cache line的大小一般是64字節(jié),如果x和y之間沒(méi)有128字節(jié)的填充,它倆就會(huì)在同一個(gè)Cache line上。

代碼中開(kāi)了兩個(gè)線程,兩個(gè)線程大概率會(huì)運(yùn)行在不同的CPU上,每個(gè)CPU有自己的Cache。

當(dāng)CPU1操作x時(shí),會(huì)把y裝載到Cache中,其他CPU對(duì)應(yīng)的的Cache line失效。

然后CPU2加載y,會(huì)觸發(fā)Cache Miss,它后面又把x裝載到了自己的Cache中,其他CPU對(duì)應(yīng)的Cache line失效。

然后CPU1操作x時(shí),又觸發(fā)Cache Miss。

它倆就會(huì)是大體這個(gè)流程:

頻繁的觸發(fā)Cache Miss,導(dǎo)致程序的性能相當(dāng)差。

而如果x和y中間加了128字節(jié)的填充,x和y不在同一個(gè)Cache line上,不同CPU之前不會(huì)影響,它倆都會(huì)頻繁的命中自己的Cache,整個(gè)程序性能就會(huì)很高,這就是傳說(shuō)中的False Sharing問(wèn)題。

所以我們寫(xiě)代碼時(shí),可以基于此做深一層思考,如果我們寫(xiě)單線程程序,最好保證訪問(wèn)的數(shù)據(jù)能夠相鄰,在一個(gè)Cache line上,可以盡可能的命中Cache。

如果寫(xiě)多線程程序,最好保證訪問(wèn)的數(shù)據(jù)有間隔,讓它們不在一個(gè)Cache line上,減少False Sharing的頻率。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    39

    文章

    7739

    瀏覽量

    171672
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11279

    瀏覽量

    224978

原文標(biāo)題:CPU Cache偽共享問(wèn)題

文章出處:【微信號(hào):程序喵大人,微信公眾號(hào):程序喵大人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)030系列集成的PreFetch 和 Cache怎么用呀?

    各位大佬,030系列集成的PreFetch 和 Cache怎么用呀?有這方面的demo或者pdf操作流程么?
    發(fā)表于 01-19 07:07

    如何在LTspice仿真中實(shí)現(xiàn)隨機(jī)數(shù)和真隨機(jī)數(shù)的生成

    本文討論如何在LTspice仿真中利用flat()、gauss()和mc()函數(shù)來(lái)實(shí)現(xiàn)隨機(jī)數(shù)和真隨機(jī)數(shù)的生成,并介紹如何使用設(shè)置面板的Hacks部分中的 Use the clock
    的頭像 發(fā)表于 01-09 14:08 ?4686次閱讀
    如何在LTspice仿真中實(shí)現(xiàn)<b class='flag-5'>偽</b>隨機(jī)數(shù)和真隨機(jī)數(shù)的生成

    采用Prefetch+Cache架構(gòu)有什么優(yōu)勢(shì)?

    我看官方說(shuō),采用Prefetch+Cache架構(gòu)同頻CoreMark 計(jì)算力/功耗比超越同類(lèi)產(chǎn)品,這優(yōu)勢(shì)就是低功耗么?要是具體芯片比較的話,應(yīng)該怎么比?
    發(fā)表于 12-11 07:35

    spi psram靜態(tài)存儲(chǔ)器的特點(diǎn)是什么

    PSRAM之所以被稱為"靜態(tài)"存儲(chǔ)器,主要是因?yàn)槠洳捎妙?lèi)SRAM的接口協(xié)議:只需要提供地址和讀寫(xiě)命令就可以實(shí)現(xiàn)數(shù)據(jù)存取,無(wú)需像傳統(tǒng)DRAM一樣需要內(nèi)存控制器定期刷新數(shù)據(jù)單元。
    的頭像 發(fā)表于 10-23 14:29 ?413次閱讀

    gd32h737 開(kāi)啟cache程序跑飛是哪里的問(wèn)題?

    gd32h737 在rtthread 4.1.1版本上運(yùn)行,開(kāi)啟cache功能,程序跑飛,JLink連接失敗的。錯(cuò)誤信息沒(méi)有。配置方式的說(shuō)明嗎? /*! briefenable the CPU
    發(fā)表于 09-11 08:28

    物聯(lián)網(wǎng)設(shè)備識(shí)別與規(guī)避蜂窩移動(dòng)網(wǎng)絡(luò)基站的技術(shù)方案

    在蜂窩移動(dòng)網(wǎng)絡(luò)中,基站已成為物聯(lián)網(wǎng)設(shè)備面臨的重要安全威脅。基站通過(guò)模擬合法基站信號(hào),利用更高的功率強(qiáng)制物聯(lián)網(wǎng)設(shè)備連接,從而獲取設(shè)備信息或進(jìn)行惡意通信。隨著物聯(lián)網(wǎng)設(shè)備數(shù)量的快速增長(zhǎng),以及在關(guān)鍵
    的頭像 發(fā)表于 09-02 16:55 ?1259次閱讀
    物聯(lián)網(wǎng)設(shè)備識(shí)別與規(guī)避蜂窩移動(dòng)網(wǎng)絡(luò)<b class='flag-5'>偽</b>基站的技術(shù)方案

    真隨機(jī)數(shù)和隨機(jī)數(shù)的區(qū)別

    隨機(jī)數(shù)在當(dāng)前程序運(yùn)行環(huán)境中是一種常用參數(shù),目前主要分為兩種,隨機(jī)數(shù)和真隨機(jī)數(shù),本期我們就來(lái)講一下二者的區(qū)別。
    的頭像 發(fā)表于 08-27 17:46 ?2638次閱讀

    RTOS怎么實(shí)現(xiàn)共享內(nèi)存?

    K230的RTOS支持POSIX標(biāo)準(zhǔn)的共享內(nèi)存嗎 我嘗試使用卻失敗 還是說(shuō)需要源碼部分配置的開(kāi)啟才可以使用 求教大佬
    發(fā)表于 08-04 08:06

    RFID標(biāo)簽在共享經(jīng)濟(jì)的應(yīng)用

    二、RFID標(biāo)簽在共享經(jīng)濟(jì)中的優(yōu)勢(shì)1.高效率:RFID可以快速批量讀取信息,大幅縮短操作時(shí)間,提高管理效率。2.準(zhǔn)確性:RFID減少了人工操作的錯(cuò)誤率,提高了共享資源管理的準(zhǔn)確性和可靠性。3.實(shí)時(shí)性
    的頭像 發(fā)表于 07-07 15:22 ?510次閱讀
    RFID標(biāo)簽在<b class='flag-5'>共享</b>經(jīng)濟(jì)的應(yīng)用

    單核CPU網(wǎng)關(guān)和雙核CPU網(wǎng)關(guān)有什么區(qū)別

    單核CPU網(wǎng)關(guān)與雙核CPU網(wǎng)關(guān)的核心區(qū)別在于處理能力、多任務(wù)效率、性能表現(xiàn)及適用場(chǎng)景,雙核CPU網(wǎng)關(guān)在多任務(wù)處理、復(fù)雜計(jì)算和響應(yīng)速度上具有顯著優(yōu)勢(shì),而單核CPU網(wǎng)關(guān)則更適合輕量級(jí)、低負(fù)
    的頭像 發(fā)表于 07-05 14:37 ?1061次閱讀

    高性能緩存設(shè)計(jì):如何解決緩存共享問(wèn)題

    在多核高并發(fā)場(chǎng)景下, 緩存共享(False Sharing) 是導(dǎo)致性能驟降的“隱形殺手”。當(dāng)不同線程頻繁修改同一緩存行(Cache Line)中的獨(dú)立變量時(shí),CPU緩存一致性協(xié)議會(huì)
    的頭像 發(fā)表于 07-01 15:01 ?762次閱讀
    高性能緩存設(shè)計(jì):如何解決緩存<b class='flag-5'>偽</b><b class='flag-5'>共享</b>問(wèn)題

    STM32H7的MPU配置與D-Cache沖突如何解決???

    現(xiàn)象??: STM32H743 MPU 與 D-Cache 沖突問(wèn)題詳細(xì)描述** 硬件環(huán)境 MCU 型號(hào) :STM32H743VIT6 開(kāi)發(fā)板 :自定義板(或 STM32H743I-EVAL 等
    發(fā)表于 06-23 17:32

    信創(chuàng)國(guó)產(chǎn)CPU推薦

    cpu
    jf_10805031
    發(fā)布于 :2025年04月23日 17:20:43

    如何在NXP MCU上啟用D-Cache

    Data Cache,我已經(jīng)能夠減少其他 MCU 的推理時(shí)間。我想知道如何在 NXP MCU 上啟用 D-Cache。任何其他性能提升策略也受到歡迎。
    發(fā)表于 03-27 07:48

    請(qǐng)問(wèn)驚鴻7110是否支持cache維護(hù)指令?

    驚鴻7110是就sifive u74處理器的。查看了一下u74手冊(cè),它是有專(zhuān)門(mén)的cache維護(hù)指令CFLUSH.D.L1。在賽昉官方版本編譯不通過(guò)。請(qǐng)問(wèn)一下大佬,這個(gè)怎么解決呀?
    發(fā)表于 03-10 07:24