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

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

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

Ampere Altra系列處理器的鎖和內(nèi)存序

安晟培半導(dǎo)體 ? 來源:安晟培半導(dǎo)體 ? 2023-06-07 17:36 ? 次閱讀

AMPERE ALTRA和AMPERE ALTRA MAX 的鎖機(jī)制

讓我們先來了解一些基本的問題。Arm 在 Arm?v8.2-A 架構(gòu)中引入了大型系統(tǒng)擴(kuò)展(Large System Extensions, LSE),它用單個原子指令取代了鎖操作的指令序列。這里 (https://dev.to/aws-builders/large-system-extensions-for-aws-graviton-processors-3eci)是一個非常不錯的總結(jié)。雖然舊的 Arm 版本在功能上可以很好地工作,但隨著核心數(shù)量的增加和鎖的爭用更加頻繁,預(yù)計(jì)性能會受到影響。Ampere Altra 和 Ampere Altra Max 支持 LSE,并配備了可擴(kuò)展的鎖性能。

為了說明使用的指令之間的差異,讓我們看看 gcc 的處理方式

__atomic_fetch_add()。在本例中,將鎖值減 1:

__atomic_fetch_add(&lockptr->lockval, -1, __ATOMIC_ACQ_REL);

使用* -march =armv8.2-a*選項(xiàng)編譯,編譯器生成帶有原子指令的代碼:

998:  f8f60280    ldaddal x22, x0, [x20]

另一方面,設(shè)置* -march =armv8-a*(不支持LSE),生成一個不同的序列:

9a4:  c85ffe60  ldaxr  x0, [x19] 
9a8:  d1000400  sub   x0, x0, #0x1 
9ac:  c801fe60  stlxr  w1, x0, [x19] 
9b0:  35ffffa1  cbnz  w1, 9a4 

為了使序列具有原子性,需要一個單獨(dú)的監(jiān)視器。ldaxr 獲得一個地址標(biāo)記,在本例中為 [x19]。然后執(zhí)行減法,然后存儲回內(nèi)存位置。但是,只有當(dāng)存儲(store)時(shí)的標(biāo)記與加載(Load)中的標(biāo)記匹配時(shí),存儲才會成功。stlxr 之后的條件分支 cbnz 檢查存儲是否成功,這意味著 load 和 store 中的標(biāo)記匹配。如果不是,則跳回序列的開頭,在本例中是地址 0x9a4。

這里值得注意的是,如果沒有 LSE 指令,這個指令序列可能要執(zhí)行幾次才能被認(rèn)為成功。使用 LSE, ldaddal 指令可以保證以一條指令完成,不需要循環(huán)。

圖 1 顯示了當(dāng)線程數(shù)從 1 增加到 80 時(shí),使用 LSE 和不使用 LSE 時(shí)每秒獲得排他鎖的性能差異。

e186c626-0515-11ee-90ce-dac502259ad0.png

圖 1

通常,Compare 和 Exchange 硬件指令用于在軟件中實(shí)現(xiàn)鎖。需要注意的是,這些指令必須是原子指令。

原子在這里是什么意思呢?這些指令首先獲得包含鎖的緩存行(Cache Line)的所有權(quán),并將其加載到 CPU 的本地緩存中。然后將當(dāng)前值與隨指令提交的比較值進(jìn)行比較。如果相等,作為指令一部分提交的新值將替換當(dāng)前值。如果不相等,則保持當(dāng)前值。這方面的原子性意味著整個序列由一個線程執(zhí)行,而沒有其他線程訪問緩存行,由硬件保證。

鎖的種類

在軟件中可以實(shí)現(xiàn)不同類型的鎖,如互斥鎖(mutexes)、票據(jù)鎖(ticket)和自旋鎖(spinlocks)。如前所述,不同的鎖類型在軟件中實(shí)現(xiàn),硬件提供類似 cmpxchg 或 fetchadd 的指令。相同的鎖類型在不同的硬件上運(yùn)行,只有使用的指令不同。

如何實(shí)現(xiàn)鎖機(jī)制

這是一個非常重要的問題。讓我們把它分解成兩個選項(xiàng):1) 使用可用的庫和 2) 使用原子指令來實(shí)現(xiàn)專有的鎖定算法。

選項(xiàng)1有幾個優(yōu)點(diǎn)。庫已經(jīng)存在,不需要自定義實(shí)現(xiàn),而且經(jīng)過了充分測試,通常將會在未來的庫版本中進(jìn)行維護(hù)。例如pthread_mutex_lock和pthread_rwlock。聽起來不錯,那么有什么缺點(diǎn)呢? 缺乏統(tǒng)計(jì)數(shù)據(jù)可能是一個問題。沒有向應(yīng)用程序返回任何信息,報(bào)告旋轉(zhuǎn)(spins)或線程被調(diào)度出多少次。此外,庫實(shí)現(xiàn)可能不太適合某些應(yīng)用程序,因?yàn)閹旄ㄓ谩?/p>

e1a4144c-0515-11ee-90ce-dac502259ad0.png

pthread_mutex_lock

https://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_mutex_lock.html

選項(xiàng) 2 更復(fù)雜。它需要實(shí)現(xiàn)鎖定函數(shù)并維護(hù)它們。但是,它可以獲得一些好處,因?yàn)樗菍iT為應(yīng)用程序設(shè)計(jì)的。鎖定原語和原子指令可以通過內(nèi)聯(lián)匯編(inline assembly)或利用編譯器的支持來實(shí)現(xiàn)。同樣,使用內(nèi)聯(lián)程序集編寫代碼需要應(yīng)用程序維護(hù)該段代碼。

對于編譯器,gcc提供了atomic built-in function,它允許應(yīng)用程序使用低級函數(shù),這些函數(shù)將被編譯成 Arm 原子指令。這些內(nèi)置函數(shù)為應(yīng)用程序提供了原子指令和內(nèi)存序指令的不同方法。代碼也更易于移植。但是,使用*-mcpu或-march*的正確設(shè)置來編譯應(yīng)用程序來生成 Arm LSE 指令是很重要的。Ampere Altra 和 Ampere Altra Max 使用 Neoverse-n1 架構(gòu),其中就包括LSE。

e1a4144c-0515-11ee-90ce-dac502259ad0.png

atomic built-in function

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

然而,使用原子指令實(shí)現(xiàn)鎖需要設(shè)計(jì)決策。如果鎖被持有,旋轉(zhuǎn)(spinning)是否合理?轉(zhuǎn)幾圈?線程在旋轉(zhuǎn)一定次數(shù)后如果不成功,是否應(yīng)該放棄?在旋轉(zhuǎn)環(huán)中需要后退,還是直線旋轉(zhuǎn)? 這些只是需要解決的問題中的一部分。

其他的設(shè)計(jì)決策

1鎖的數(shù)據(jù)類型和大小

通常,應(yīng)用程序使用 int 或long 作為鎖。用于原子操作的內(nèi)置函數(shù)(Built-in functions)從內(nèi)存中讀取鎖值。如果應(yīng)用程序也直接讀取鎖值,鎖類型應(yīng)該有“volatile”前綴,例如 volatile long。使用 volatile,編譯器生成從內(nèi)存中讀取數(shù)據(jù)的指令。否則,該值可能在寄存器中而沒有更新,從而錯過對鎖位置的更新。

2鎖的粒度

由于競爭,粗粒度鎖有可能成為性能瓶頸。另一方面,如果每個資源都有自己的鎖來保護(hù),那么將需要大量內(nèi)存來存儲鎖。必須是一種折衷設(shè)計(jì),以避免任何不利因素。

3鎖對齊

編譯器對結(jié)構(gòu)進(jìn)行正確對齊。如果應(yīng)用程序管理自己的內(nèi)存,那么鎖的位置可能與鎖的大小不一致。在最壞的情況下,鎖可能跨越兩條緩存行。在 AArch64 上,對未對齊鎖的原子操作會導(dǎo)致 SIGBUS (硬件向操作系統(tǒng)發(fā)出信號,表明 CPU 不能尋址內(nèi)存地址的總線錯誤,在這種情況下是由于未對齊訪問)。從積極的方面來看,獲得 SIGBUS 需要固定對齊,而不是隱藏很少被發(fā)現(xiàn)的性能問題。

4假共享

虛假分享是什么意思?即同一高速緩存行上的獨(dú)立數(shù)據(jù)對性能有不良影響,鎖數(shù)組就屬于這一類。這些鎖保護(hù)不同的關(guān)鍵區(qū)域。但是,對同一緩存行上鎖的原子操作會影響該緩存行上的所有鎖。重要的是,原子性不是針對鎖本身,而是針對包含鎖的整個緩存行。

5在 cmpxchg 之前做測試

在執(zhí)行 cmpxchg 指令之前讀取自旋循環(huán)(spinloop)中的鎖值可能對爭用鎖有利。Cmpxchg 需要緩存行的所有權(quán),而test將以共享模式獲取緩存行,從而避免失效。然而,這可能會增加執(zhí)行的 spin 數(shù)量。

6如果可能的話,在無鎖時(shí)

使用fetchadd 而不是 cmpxchg

釋放鎖需要返回線程為獲取鎖而執(zhí)行的操作。Cmpxchg,特別是對于共享鎖或讀寫鎖,需要一個循環(huán),并且由于鎖值的變化而可能會重試操作。然而,fetchadd 不需要循環(huán),沒有比較,因此它會成功。

7鎖定持有時(shí)間

通常指臨界區(qū)域內(nèi)的指令數(shù)或在臨界區(qū)域內(nèi)花費(fèi)的時(shí)間。時(shí)間是一個更好的度量標(biāo)準(zhǔn),因?yàn)榕R界區(qū)域可能只有很少的指令。然而,所有的指令都可以從內(nèi)存中讀取。嵌套鎖屬于同一類別。無法獲得內(nèi)部鎖以及 spinning 或 sleeping 會影響外部鎖的保持時(shí)間。減少關(guān)鍵區(qū)域的保持時(shí)間總是好的,如果數(shù)據(jù)在本地緩存而不是內(nèi)存中就更好了。

8搶占

不幸的是,線程在持有鎖時(shí)可能會被重新調(diào)度。如果鎖處于獨(dú)占模式,這意味著沒有其他線程能夠獲得鎖。在考慮性能問題時(shí),要記住這一點(diǎn)。較短的保持時(shí)間將降低搶占的可能性。

內(nèi)存序

如前所述,正確的內(nèi)存排序指令對于正確性很重要。AArch64 遵循一種寬松的內(nèi)存模型。使用 LSE, AArch64 指令強(qiáng)制執(zhí)行特定的內(nèi)存順序。例如,cmpxchg 指令集有獲取(CASA 指令)、釋放(CASL 指令)以及獲取和釋放(CASAL 指令)的版本。硬件保證這些指令遵循其特定指令的內(nèi)存模型。這取決于軟件使用適當(dāng)?shù)闹噶?。通常,acquire 用于鎖獲取,Release 用于鎖釋放。但是,如果應(yīng)用程序在無鎖之后讀取數(shù)據(jù)(例如,如果該鎖有任何等待程序),那么空閑程序的 release 語義可能會導(dǎo)致問題,因?yàn)閷Φ却绦蚪Y(jié)構(gòu)的讀取可能會提升到空閑程序之上,因此在空閑程序之后,寄存器中就會出現(xiàn)陳舊的數(shù)據(jù)。在這些情況下,最好使用 acquire 和 release 語義。同樣,這取決于應(yīng)用程序?qū)崿F(xiàn)。gcc 編譯器直接在內(nèi)置函數(shù)中使用這些指令,如下列網(wǎng)址所示。

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

總結(jié)

Ampere 系列處理器正以其持續(xù)增加的核心數(shù)量不斷挑戰(zhàn)性能極限,并具備使用鎖的多線程應(yīng)用程序可擴(kuò)展性的所有要素。使用 LSE,在硬件中提供原子指令以獲得更好的鎖性能。正如我們在本文所看到的,應(yīng)用程序開發(fā)人員可以通過鎖庫或正確實(shí)現(xiàn)鎖定算法來充分利用這些指令。

關(guān)于 Ampere Computing

Ampere Computing 是一家現(xiàn)代化半導(dǎo)體企業(yè),致力于塑造云計(jì)算的未來,并推出了世界上首款云原生處理器。為可持續(xù)云而生,Ampere 云原生處理器兼具最高性能和最佳每瓦性能,助力加速多種云計(jì)算應(yīng)用的交付,為云提供行業(yè)領(lǐng)先的性能、能效和可擴(kuò)展性。

審核編輯:湯梓紅

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

    關(guān)注

    68

    文章

    18927

    瀏覽量

    227232
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365041
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73539
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    598

    瀏覽量

    35507
  • Ampere
    +關(guān)注

    關(guān)注

    1

    文章

    60

    瀏覽量

    4516
收藏 人收藏

    評論

    相關(guān)推薦

    Ampere推出業(yè)內(nèi)首款擁有最多內(nèi)核數(shù)量的云原生處理器系列

    Ampere Altra系列提供了解決各種工作負(fù)載的靈活性,并且Ampere正在與生態(tài)系統(tǒng)中的伙伴合作,以滿足客戶的特定需求。
    發(fā)表于 06-28 16:44 ?1479次閱讀

    業(yè)界首款!Ampere發(fā)布有80個核心的ARM處理器

    今天晚上,Ampere發(fā)布了Ampere Altra處理器,官方稱這是業(yè)界首款80核服務(wù)處理器
    的頭像 發(fā)表于 03-04 10:11 ?2535次閱讀

    Ampere發(fā)布業(yè)內(nèi)首款80核ARM架構(gòu)64位處理器Altra 并已開始向云服務(wù)和邊緣計(jì)算客戶出樣

    高性能計(jì)算公司Ampere今日發(fā)布了業(yè)內(nèi)第一款80核ARM架構(gòu)64位處理器Altra,其用于服務(wù)、數(shù)據(jù)中心產(chǎn)品,目標(biāo)是與Intel、AMD所代表的x86陣營競爭。
    發(fā)表于 03-04 11:33 ?1260次閱讀

    Ampere全新推出業(yè)界首款80核服務(wù)處理器Ampere Altra?處理器

    安晟培半導(dǎo)體科技有限公司(Ampere Computing)于今日正式發(fā)布全新一代Ampere Altra?處理器,此款產(chǎn)品是業(yè)界首款搭載80個內(nèi)核數(shù)量的服務(wù)
    發(fā)表于 03-05 07:53 ?1286次閱讀

    安晟培半導(dǎo)體Ampere Altra處理器推出,應(yīng)用于云和邊緣計(jì)算數(shù)據(jù)中心中

    3月4日消息,據(jù)國外媒體報(bào)道,安晟培半導(dǎo)體科技有限公司(Ampere Computing,簡稱“安晟培半導(dǎo)體”)發(fā)布Ampere Altra處理器,這是業(yè)界首款搭載80個內(nèi)核數(shù)量的服務(wù)
    的頭像 發(fā)表于 03-04 17:03 ?3092次閱讀

    詳細(xì)解說Ampere Altra性能測試與結(jié)果對比

    現(xiàn)代云對更高的性能,更好的可擴(kuò)展性,能源效率的需求在不斷增長。去年年初發(fā)布的業(yè)內(nèi)首款云原生處理器AmpereAltra,以全新設(shè)計(jì)以滿足現(xiàn)代云的需求,具有令人矚目的整數(shù)性能,高內(nèi)核數(shù)和出色的能源效率等特點(diǎn),Ampere Altra
    的頭像 發(fā)表于 03-24 15:13 ?7178次閱讀
    詳細(xì)解說<b class='flag-5'>Ampere</b> <b class='flag-5'>Altra</b>性能測試與結(jié)果對比

    Ampere? Altra? Max 對比測試數(shù)據(jù)公布,性能能效雙領(lǐng)先

    ,軟件架構(gòu)得以重建,就如同搬進(jìn)新家時(shí),家具需要因地制宜重新擺放。 ? 2020 年,面向云計(jì)算的新時(shí)代,Ampere Computing 設(shè)計(jì)并推出了第一款云原生處理器——80 核?Ampere??
    的頭像 發(fā)表于 04-02 11:30 ?3862次閱讀
    <b class='flag-5'>Ampere</b>? <b class='flag-5'>Altra</b>? Max 對比測試數(shù)據(jù)公布,性能能效雙領(lǐng)先

    Ampere Altra處理器實(shí)現(xiàn)Arm架構(gòu)運(yùn)行虛擬機(jī)

     近日,微軟推出了基于 Ampere Altra 云原生處理器的 Azure 虛擬機(jī)(VM)。
    的頭像 發(fā)表于 04-10 10:16 ?3326次閱讀

    HPE正式發(fā)布搭載Ampere云原生處理器的HPE ProLiant RL300 Gen11平臺

    在今年的 HPE Discover 2022 全球峰會上,HPE 宣布正式發(fā)布搭載 Ampere AltraAmpere Altra Max 云原生
    的頭像 發(fā)表于 07-13 11:40 ?2073次閱讀

    Ampere Computing發(fā)布全新AmpereOne系列處理器,192個自研核

    2023 年 5 月 19 日,中國北京——Ampere Computing 宣布推出全新 AmpereOne 系列處理器,該處理器擁有多達(dá) 192 個單線程
    的頭像 發(fā)表于 05-19 11:04 ?1151次閱讀

    Ampere全新AmpereOne系列處理器,多達(dá)192個單線程Ampere

    強(qiáng)調(diào)Ampere憑借過去Ampere AltraAmpere Altra Max處理器創(chuàng)建了云
    發(fā)表于 05-23 11:44 ?402次閱讀

    Ampere發(fā)布AmpereOne系列處理器,單顆處理器支持最高192個物理核心

    AmpereOne出現(xiàn)以前,Ampere Altra系列最多128核心,新的AmpereOne則是從136核起步,最多192核心。所以,AmpereOne可以看做是Ampere
    發(fā)表于 06-02 10:43 ?528次閱讀
    <b class='flag-5'>Ampere</b>發(fā)布AmpereOne<b class='flag-5'>系列</b><b class='flag-5'>處理器</b>,單顆<b class='flag-5'>處理器</b>支持最高192個物理核心

    優(yōu)化指南-Ampere? Altra?系列處理器內(nèi)存

    讓我們先來了解一些基本的問題。Arm 在 Arm?v8.2-A 架構(gòu)中引入了大型系統(tǒng)擴(kuò)展(Large System Extensions, LSE),它用單個原子指令取代了操作的指令序列
    發(fā)表于 06-07 17:35 ?846次閱讀
    優(yōu)化指南-<b class='flag-5'>Ampere</b>? <b class='flag-5'>Altra</b>?<b class='flag-5'>系列</b><b class='flag-5'>處理器</b>的<b class='flag-5'>鎖</b>和<b class='flag-5'>內(nèi)存</b><b class='flag-5'>序</b>

    全新AmpereOne系列處理器,一款192核的云原生CPU

    這個基于自研內(nèi)核打造的產(chǎn)品與之前的產(chǎn)品不會存在任何的兼容問題,因?yàn)锳mpereOne系列處理器Ampere Altra系列
    發(fā)表于 06-08 11:50 ?820次閱讀
    全新AmpereOne<b class='flag-5'>系列</b><b class='flag-5'>處理器</b>,一款192核的云原生CPU

    基于Ampere Altra 系列處理器的一系列平臺為 AI 高效賦能

    ,‘芯’未來”的主題,Ampere 在本次活動上展示了基于 Ampere Altra 系列處理器的一系列
    的頭像 發(fā)表于 09-21 09:13 ?757次閱讀