chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

CPU Cache偽共享問題

程序喵大人 ? 來源:程序喵大人 ? 作者:程序喵大人 ? 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;
}

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

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

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

如圖:

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

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

什么是CPU Cache?

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

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

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

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

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

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

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

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

但CPU Cache這里還有個小問題,看下這兩段代碼:

代碼段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();
}

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

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

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

為什么?

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

代碼中開了兩個線程,兩個線程大概率會運行在不同的CPU上,每個CPU有自己的Cache。

當CPU1操作x時,會把y裝載到Cache中,其他CPU對應的的Cache line失效。

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

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

它倆就會是大體這個流程:

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

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

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

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

審核編輯:郭婷

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

    關(guān)注

    39

    文章

    7693

    瀏覽量

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

    關(guān)注

    68

    文章

    11189

    瀏覽量

    221449

原文標題:CPU Cache偽共享問題

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    gd32h737 開啟cache程序跑飛是哪里的問題?

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

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

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

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

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

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

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

    如何在NXP MCU上啟用D-Cache

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

    腦電跡系列之腦電跡處理與技術(shù)剖析

    在上一篇系列文章中了解到,腦電信號反映大腦神經(jīng)元活動,在神經(jīng)科學研究、臨床診斷、腦機接口等領(lǐng)域應用廣泛。但腦電信號幅值微弱極易受跡干擾。這些跡降低信號信噪比,增加數(shù)據(jù)變異性,導致實驗結(jié)果偏差
    的頭像 發(fā)表于 03-04 20:24 ?1492次閱讀
    腦電<b class='flag-5'>偽</b>跡系列之腦電<b class='flag-5'>偽</b>跡處理與技術(shù)剖析

    腦電跡全解析:類型、成因與影響

    在腦電信號研究領(lǐng)域,腦電跡是影響數(shù)據(jù)準確性的關(guān)鍵因素。深入了解腦電跡,對獲取可靠腦電數(shù)據(jù)、推動腦科學研究意義重大。腦電跡的產(chǎn)生根源腦電信號由大腦神經(jīng)元電活動產(chǎn)生,極其微弱,通常處于幾十微伏的低
    的頭像 發(fā)表于 02-25 22:26 ?2672次閱讀
    腦電<b class='flag-5'>偽</b>跡全解析:類型、成因與影響

    真雙極和準雙極,差動跟差動使用的性能有差別嗎?

    最近需要用到差動輸入的adc,找了很多型號,發(fā)現(xiàn)有真雙極和準雙極,差動輸入方式的還分差動跟差動。網(wǎng)上找不到相關(guān)介紹,一般我們用單極adc要測量雙極信號需要將信號抬高1/2vcc,我的理解是準雙極的原理和抬高輸入信號的原理一樣。不知道真雙極和準雙極,差動跟差動使用的性
    發(fā)表于 02-08 07:52

    hyper-v共享,Hyper-V 共享:Hyper-V的資源共享設(shè)置

    的解決方案。今天就為大家介紹Hyper-V共享:Hyper-V的資源共享設(shè)置。 ? ?在Hyper-V虛擬化環(huán)境中,資源共享是實現(xiàn)高效管理和靈活部署的關(guān)鍵功能之一。Hyper-V提供了多種資源
    的頭像 發(fā)表于 02-07 10:26 ?1611次閱讀
    hyper-v<b class='flag-5'>共享</b>,Hyper-V <b class='flag-5'>共享</b>:Hyper-V的資源<b class='flag-5'>共享</b>設(shè)置

    高速緩沖存儲器是內(nèi)存還是外存,高速緩沖存儲器是為了解決什么

    高速緩沖存儲器(Cache)是內(nèi)存的一種特殊形式,但它與通常所說的主存儲器(RAM)有所不同。在計算機存儲體系中,Cache位于CPU和主存儲器之間,用于存儲CPU近期訪問過的數(shù)據(jù)或指
    的頭像 發(fā)表于 01-29 11:48 ?2311次閱讀

    有內(nèi)部模式讓ADS8363里面有兩個AD,能一個AD工作在全差分,一個工作在差分嗎?

    工作在差分嗎? 我現(xiàn)在有兩個信號需要同步采集,設(shè)計的是兩個AD均工作在差分,但發(fā)現(xiàn)差分噪聲較大,需要將其中一路調(diào)整為全差分,另一路電壓范圍不方便調(diào)節(jié),所有希望仍然采用差分,采集
    發(fā)表于 01-02 07:57

    請問AD7616是單端輸入還是差分輸入?

    請問 AD7616是單端輸入還是差分輸入
    發(fā)表于 12-19 07:38

    什么是緩存(Cache)及其作用

    緩存(Cache)是一種高速存儲器,用于臨時存儲數(shù)據(jù),以便快速訪問。在計算機系統(tǒng)中,緩存的作用是減少處理器訪問主存儲器(如隨機存取存儲器RAM)所需的時間。 緩存(Cache)概述 緩存是一種位于
    的頭像 發(fā)表于 12-18 09:28 ?1.4w次閱讀

    請問什么叫差分結(jié)構(gòu)?什么叫真差分信號?

    請問什么叫差分結(jié)構(gòu)?什么叫真差分信號?
    發(fā)表于 12-16 07:33

    OPA1642做一個差分和差分輸出轉(zhuǎn)換的電路,在差分的情況下遇到的問題求解

    我在做一個差分和差分輸出轉(zhuǎn)換的電路,但是在差分的情況下遇到下面的問題,用理想運放仿真負端就不會出現(xiàn)類似方波的情況,但是用OPA1642就有這個問題,方波的峰峰值大概5V,請幫忙看看是否是前端電阻匹配的不合適,兩個輸入信號是相位相差180度,峰值為5V的正弦波,謝謝
    發(fā)表于 11-07 06:07