簡體   English   中英

為什么RISC-V沒有指令計算執行?

[英]Why does RISC-V not have an instruction to calculate carry out?

我需要在 RISC-V 上處理 bignum 計算(加法和減法,但我將減法視為等效於有符號加法),情況有點復雜。 我從半小時的互聯網研究中收集到的信息:

  • RISC-V 操作不提供檢查進位或溢出的方法
  • 這個決定的動機是標志或其他處理它的方式給亂序微架構增加了很多復雜性。
  • 相反,他們建議事后做分支
    • 對於無符號加法,可以使用單個bltu完成溢出處理。
    • 如果其中一個操作數的符號已知,則符號加法相同
    • 否則,需要執行兩次檢查(三個附加指令)
  • 互聯網上的人們對此非常憤怒(我不會在這里鏈接它)

據我所知,這些分支確實很好地涵蓋了大多數場景,除了一個:(簽名)大數加法。 因為在那里,我們在熱循環中遇到了最慢的檢查路徑。

我對 ISA 設計知之甚少,但為什么它們不包含計算(a + b) >> 32的指令(實際上是執行)? 有點像乘法指令也被拆分為mulmulh 這將允許始終使用兩條指令進行所需的計算。 更強大的微架構甚至可以檢測到序列並且只進行一次加法。

我是否遺漏了一些會使該指令過時(或等同於它)的技巧? 它有我監督的任何主要缺點嗎? 我沒有找到很多關於這個一般主題的好文檔。

add / sltu為您提供總和和進位: https://godbolt.org/z/Y7f5dzj1P顯示 GCC 將其用於無符號數學: sum=a+b / carry = sum<a

但問題在於缺少 ILP:在add結果准備好之前, sltu無法啟動。 如果您可以直接從輸入中獲得結轉,則可以解決此問題; 好點子。 當然 add/sltu 的融合也可以解決這個問題; 也許這就是建築師的想法。

大於 2 個 reg-width 的 bignum另一個主要問題是使用進位進行加法(在帶有進位標志和加法進位指令的 ISA 上)。 更糟糕的是,從那個 3 輸入加法中得到結轉。 (其中任何一部分都可以換行,因此 AFAIK 無法將其組合成一個添加和比較。這是adc的純 C 實現的常見缺陷;對該鏈接答案的評論有效 C,但無法編譯非常有效)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM