是否有可能統一編譯器底層實現?

時間 2021-05-11 19:14:35

1樓:Slow Learner

cpu 還行,但萬一是非常exotic的計算單元,比如支援Tensor Addition或者離散的卷積的指令,為了最好的發揮計算單元的能力,你要不 1.讓使用者寫intrinsic 2. 自動生成指令,宛如auto-vectorization

前者破壞了你的願景(你想要統一不是嗎),後者真的很難--至少使用者在寫for loop + addition的時候,你要至少生成vector instruction (這個雖然llvm已經做到了,但還是很弱) -- 要不 syntactically pattern matching (這明顯會漏掉很多case) 要不semantically 做(這我完全不清楚,然而麻煩在於你semantically做你需要解釋乙個指令的語義,這是難以想象的麻煩 (那麼多指令,同一指令會有很多的variance))

2樓:XZiar

我覺得不現實,比如SSA這種東西拿硬體怎麼實現。

但如果你只是想要一種統一的寫法,不要求和硬體指令一一對應,那現在的IR的確可以做到,llvm又不禁止你去手寫ll檔案。

只是,「統一寫法的高層語言」,這玩意兒不是多了去了嘛,C++/C#/python/JS它們不香嘛,為什麼要去寫llvm IR這種跟硬體無關但又過分底層的語言?

3樓:次元碎片

如果能有統一的ISA,就可以有統一的編譯器後端。但歷史原因和效能考慮都決定了不能有統一的ISA,故不能有統一的backend:歷史很好理解,效能則與應用相關,有些應用要高效能,有的應用要低功耗,對指令的粒度要求不同,粗粒度的指令性能肯定要比用多個細粒度指令拼出來的效率高。

理論上講,乙個可擴充套件的指令集可以做得到上述事情,比如riscv。但現實中它能取代arm就算超額完成任務了。

從另外乙個角度說,是不是可以從編譯器出發做處理器呢?這個還真可以,也是個不錯的思路,面向halide的處理器就是乙個例子。

4樓:小乖他爹

這是乙個成本的問題,也是乙個誰服從於誰的問題。

題主的假設是晶元廠商服從於編譯器標準,指令集架構直接對接IR,這個思路從技術層面可操作,雖然代價很大。

但是在現實生活之中,指令集架構之所以那麼設計也是有原因的,為之配套專門的後端在LLVM框架下的工作量並不是很大。相比較之下,晶元廠商服從於編譯器標準,直接硬性對接IR,成本過高,有點得不償失了。這是成本方面的問題。

另外乙個方面就是誰更強勢的問題,可以不精準的說工具鏈是依賴於晶元的,而不是晶元依賴工具鏈。所以,整個大的產業和歷史背景都是工具鏈依賴於晶元,這種情況下要求晶元向工具鏈退讓,顯然不太可能。

5樓:狗肉 花與果

部分可以後端通常都會有通用的IR 比如LLVM裡的DAG

但是很難,因為各架構差異大,公共IR無法滿足所有架構的需求的,所以LLVM裡也允許自定義ISD opcode自己做。和LLVM IR嚴格的公共IR完全不同。

RISC架構標量計算的時候還好,涉及到向量,浮點,或者CISC的時候,這個問題最明顯。所以後端統一IR只能做一小部分,剩下的還是得交給各個架構自己

6樓:

沒有太看懂題目的描述。。。比如說編譯器的底層實現指的是什麼呢?指的是IR嗎?還是說編譯器最後輸出的結果?

因為不太懂答主的意思,所以自己靠猜測補完了一些設定。

如果把IR看做一種高層點的「組合語言」,那麼這個「組合語言」不就具備很好的可移植性了?!

這麼想其實沒什麼意義,因為這裡說的組合語言還是原來所說的 IR,只是起了個新的名字叫 「組合語言」,但這個和正常語境下的「組合語言」還是不一樣的,依然是兩個是東西。正常語境下的 「組合語言」,如你所說,是指令集的乙個簡單對映。但是 IR 到指令集的對映(這裡不應該用對映這個詞)我想並不會很簡單。

只要我們把llvm的IR作為乙個高層彙編標準看待,所有的cpu廠商只需要實現我所有的IR的指令模式。

這說的應該應該是讓所有的 cpu 廠商來實現從IR到他們自己 cpu 的翻譯優化部分。

所以我沒猜錯的話,題主想問的問題應該是,能否設計出一種有足夠表達力的IR?使得之後的編譯器只需要輸出這種IR就夠了,剩下的從IR到機器碼的翻譯交給各個cpu廠商來實現。

我們現在常說的編譯器可以簡單分為前端,中端和後端三部分。前端將程式語言轉換為IR,中端將前端輸出的IR轉化為優化過的IR,後端則生成不同架構所對應的機器碼。

而在上面所描述的問題當中,則相當於修改了編譯器的含義,認為編譯器只包含前端和中端,把後端的活甩給了 cpu 廠商。

大學3年立志像輪子哥寫個編譯器,可能嗎

碎竹 可以的,我就學了一學期c,暑假自學的資料結構和演算法,現在在學編譯原理,老師給了框架,逐步填內容中。我乙個半路出家的通過半年的學習尚且都可以這樣寫,你好好學三年差啥寫不出。 本渣根據llvm的tutorial寫了乙個簡單的支援整形,陣列的直譯器,不用1個月,感覺只要肯靜下心學,很多東西就是豁然...

這是不是乙個C 編譯器的bug

Ubp.a 這是空基類問題。為什麼要寫成這種基類 Vec 的形式?想必題主也清楚,就是 復用函式實現 而不僅僅是 concept。這裡題主復用了乙個函式實現,是 operator 很好現在想復用另一種函式實現,加法得寫成怎樣呢?如下 template Impl typenameT,size t N ...

現代C C 編譯器有多智慧型?能做出什麼厲害的優化?

Xi Yang 弱爆了,連幫我把卷積自動 優化 成FFT加速的都做不到。另外,如果你寫 struct MyVec4i 使用處 MyVec4i v1 1,2,3,4 MyVec4i v2 5 6 7 8 MyVec4i result v1 v2 MSVC 我特麼就是要往記憶體裡放。 原子筆 我把裡面的...