欧美在线专区-欧美在线伊人-欧美在线一区二区三区欧美-欧美在线一区二区三区-pornodoxxx中国妞-pornodoldoo欧美另类

前ARM工程師批評:RISC

[導讀]本文最初完成于幾年之前,工程彼時作者正在 ARM 公司擔任執行核心驗證工程師職位。師批作者當時的工程工作深入或圍繞多種處理器核心,而文中提到的師批觀點深受這些經驗的影響,換句話說,工程這些觀點存在不同程度的師批偏見。

前言

本文最初完成于幾年之前,工程彼時作者正在 ARM 公司擔任執行核心驗證工程師職位。師批作者當時的工程工作深入或圍繞多種處理器核心,而文中提到的師批觀點深受這些經驗的影響,換句話說,工程這些觀點存在不同程度的師批偏見。

前ARM工程師批評:RISC


作者依舊堅持認為 RISC-V 的工程設計并不完美,但同時也承認,師批如果現在需要搭建一個 32 或 64 ?位的工程 CPU,他在實現構建時也會從現有工具中受益。?


本文主要基于 RISC-V ISA 規范 v2.0,部分已更新至 v2.2。





一些觀點





RISC-V ISA 對極簡主義的追求鉆了牛角尖,它極力強調減少指令數量,規范編碼等等。而這種追求則導致了錯誤的正交性(分支、調用、返回時重復使用同一指令),以及對贅余指令的需求,這些在程序大小和指令數量上都會影響到代碼密度。



以下面的 C 代碼為例:

    int readidx(int *p, size_t idx){  return p[idx]; }


    簡單的數組索引,非常常見的操作。將其在 x86_64 中編譯:

      mov eax, [rdi+rsi*4]ret


      或者是 ARM 中:

        ldr r0, [r0, r1, lsl #2]bx lr // return


        但是在 RISC-V 中需要的代碼則是:

          # 很抱歉如果有任何語法錯誤,risc-v 并沒有在線編譯器slli a1, a1, 2add a0, a1, a1lw a0, a0, 0jalr r0, r1, 0 // return


          RISC-V 的極簡主義讓解碼器(CPU 前端)變得更簡單,代價則是需要執行更多的指令。然而,相對于拓寬流水線這個難題而言,解碼不規則指令的問題很好解決,主要難點在于確定指令的長度是否一致。x86 的眾多前綴就是個極佳的反面教材。對指令集的簡化不應追求極限。寄存器 + 移位寄存器的內存操作指令是程序中非常常見且簡單的操作,對于 CPU 而言也很容易實現。即使無法直接執行,CPU 也可以相對輕松地將其分步執行,其操作復雜程度遠遜色于融合簡單操作的序列。


          CISC CPU 中的“復合”指令,繁復、少有使用且普遍性能低下,而 CISC 和 RISC CPU 通用的“功能”指令則意指結合了少量操作序列并且使用率高、性能高的指令。這二者應當有所區分。





          還不錯的部分





          幾乎不受任何限制的可擴展性。雖說這是 RISC-V 的賣點,但它同時也是碎片化、不兼容生態系統的罪魁禍首,在管理時還需加倍小心。


          調用、返回和寄存器間接分支使用同一指令(JALR)。分支預測需要額外解碼。


          • 調用:Rd = R1

          • 返回:Rd = R0, Rs =R1

          • 間接分支: Rd = R0, Rs≠ R1

          • (奇怪分支:Rd≠ R0, Rd ≠ R1)


          可變長度編碼無法自我同步。x86 和 Thumb-2 中都存在的常見問題,會導致實現和安全性方面的各種漏洞,例如面向返回的編程攻擊。


          RV64I 規定所有 32 位值的符號擴展。這一點會導致不必要的上半切換,或者需要對寄存器的上半部分進行特殊調整。建議采用零擴展,在減少切換的同時,通常還可以在已知上半部分為零的情況下,通過追蹤”為零“位來進行優化。


          乘法是可選項。考慮到高速乘法器在微型實現中占用的面積不容忽視,創建占用更小,還可以將現有 ALU 廣泛用于多循環乘法的小型乘法器不失為良策。


          LR/SC 指令對有限使用子集有嚴格的最終轉發要求。盡管這項限制頗為嚴苛,但對于沒有緩存的小型實現而言有可能會帶來一些問題。


          這一點似乎是 CAS 指令的替代品,具體請參照有關該指令的注釋。


          FP 粘性位和舍入模式處于同一寄存器中。如果想通過執行 RMW 操作改變舍入模式,則需要對 FP 管道進行序列化。


          FP 指令支持的編碼精度有 32 位、64 位和 128 位,唯獨沒有硬件中更為常見的 16 位。

          這點很容易修正:我們有免費的字組編碼 2’b10。


          更新:v2.2 中添加了十進制 FP 擴展占位符,但仍然沒有半精度占位符。迷惑行為。


          FP 寄存器文件中的 FP 值未指定,但可以通過加載 / 存儲觀察到。


          仿真器作者要恨死你了。


          VM 遷移會將變為不可能。


          更新:v2.2 需要 NaN 裝箱更寬的值。





          糟糕的部分





          沒有條件代碼,只有比較和分支指令。這一點自身沒什么問題,但它意味著:需要編碼一到二個寄存器說明符,導致條件分支中的編碼空間減少。


          沒有條件選擇,這一點在高度不可預測的分支中很有用。


          加法 / 減法沒有加進位或借位。(即使這樣,這也比 ISA 將 flag 寫入通用寄存器 GPR,然后在結果 flag 上分支要好。)



          用戶級 ISA 需要高精度計數器。在實踐中,將這些計數器暴露給應用程序意味著側通道攻擊的好機會。


          乘法和除法同屬于一個擴展,無法單獨實現其中之一。相比除法,乘法要簡單許多,而且在大多的 CPU 上很常見。


          基礎 ISA 中沒有原子指令。多核微型處理器越來越普遍的今天,LL/SC 類型原子指令也越來越廉價:只需要 1 位 CPU 狀態即可完成最小 CPU 實現。


          LR/SC 和更復雜的原子指令同屬于一個擴展。直接限制了小型實現的靈活性。


          ? 非 LR/SC 的一般原子指令不包含 CAS 原語


          CAS 的設計是為了避免需要一條指令讀取 5 個寄存器的情況,例如:加法器、Cmp:CmpLo,SwapHi:SwapLo。但 LR/SC 用于取代 CAS 的保底進度很可能只會在實現上帶來更高的開銷。


          原子指令僅支持 32 位或 64 位操作,不支持 8 位或 16 位。


          對 RV32I 而言,想在整數和浮點寄存器文件之間轉換 DP 和 FP,只能通過內存解決。


          舉例來說:RV32I 的 32 位 ADD 和 RV64I 的 64 位 ADD 共用同一套編碼,RV64I 又多加了一套 ADD.W 編碼。如此一來,CPU 實現這兩種指令時麻煩了許多,不如直接新增一套 64 位編碼。


          沒有 MOV 指令。匯編器對于 MV 的等效指令是:MV rD, rS ->ADD rD, rS, 0。MOV 優化通常由高端處理器,尤其是失序處理器完成。識別 RISC-V 規范的 MV 需要一個 12 位的立即數。


          在沒有 MOV 指令的情況下,ADD rD, rS, r0 是對 MOV 不錯的替代。它更易被解碼,而 CPU 通常也會有特殊情況下的邏輯來識別零寄存器。





          尤為糟糕的部分





          JAL 在本該只是 R1(分支時是 R0)的鏈接寄存器編碼上浪費了 5 比特。


          這意味著 RV32I 有 21 位的分支位移(對于諸如瀏覽器等大型應用時,不使用多指令序列或者分支 island 時會不夠用)。



          ? 其實是 1.0 版本 ISA 的歷史遺留問題


          盡管 RISC-V 在統一編碼上花了大功夫,但加載 / 存儲指令的編碼仍然是不同的(寄存器 vs 立即字段互換)。


          似乎寄存器編碼的最終正交性要比兩種高度相關指令的正交性更受歡迎??紤]到地址生成是對時序更為敏感的操作,這種選擇有點奇怪。


          寄存器偏移量(Rbase +Roffset)或索引(Rbase + Rindex << Scale)沒有負載。


          FENCE.I 意味著指令緩存和前面的存儲區必須完全同步,無論是否有 fence。實現時需要在 fence 上刷新 I,或者通過snoop的方式監視D 和存儲緩存區。


          RV32I 中,讀取 64 位計數器需讀取上半部分兩次,并進行比較和分支,以防在讀取操作時下半部分和上半部分發生借位。


          通常 32 位 ISA 包含了一個“讀取一對特殊寄存器”的指令來避免這個問題。


          架構上沒有定義“提示”編碼空間。提示編碼是指在當前處理器上作為 NOP 執行,但在之后的變量上有操作的編碼。


          “NOP 提示”的常見例子是自旋鎖 yield。


          更復雜的提示也有實現。即那些對新處理器有明顯副作用的提示,例如 x86 的邊界檢查指令被編碼在提示空間,以便二進制文件保持向后兼容。


          原文地址

          https://gist.github.com/erincandescent/8a10eeeea1918ee4f9d9982f7618ef68


          本文轉自InfoQ中文站,版權歸原作者所有,如有侵權請聯系刪除

          首發地址:

          https://www.infoq.cn/article/qp5c2tUjk88zE2EipZuE


          END

          來源:InfoQ中文站

          版權歸原作者所有,如有侵權,請聯系刪除。

          ▍ 推薦閱讀

          成功為華為“續命:中國芯片之父張汝京

          一個工程師的“噩夢”:剛分清CPU和GPU,卻發現還有……

          這位“華為天才少年”,竟然要我用“充電寶”打《只狼》


          免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

          Popular articles

          主站蜘蛛池模板: 在线观看免费av网站| 欧美中文字幕无线码视频 | 亚洲欧美国产精品第1页| 中文毛片无遮挡高清免费| 美女131爽| 榴莲榴莲榴莲榴莲官网| 最新欧美精品一区二区三区| 乱人伦中文字幕电影| 深夜a级毛片| 最近中文字幕2019国语7| 翁熄合h| 精品国产综合区久久久久久| 中文字幕在线高清| 美女裸体a级毛片| 午夜时刻免费实验区观看| 波多野结衣中文字幕一区二区三区| 在线日韩三级| 蜜臀91精品国产高清在线观看| 免费看黄网站在线看| 99re热这里有精品首页视频| 西西人体高清444rt·wang| 欧美一区二区三区久久综| 最近2019中文字幕mv免费看| 午夜精品久久久久久| 拔播拔播华人永久免费| 女人扒开裤子让男人桶| 污网站免费| 精品伊人久久| 久久精品国产99国产精品 | 天天夜夜狠狠| 伊人丁香狠狠色综合久久| 欧美乱人妖大交xxxx| 欧美精品blacked中文字幕| 一本久久a久久精品vr综合| 久久精品国产欧美日韩| 日本电影二区| 欧美人与牲动交xxxx| 日女人p| 国产精品亚洲片在线花蝴蝶| 131美女爽爽爽爱做视频| 北条麻妃中文字幕在线观看|