4

我無法在內核中找到很多SIMD指令(如SSE/AVX)的使用(除了用於加速RAID6的奇偶校驗計算的地方)。爲什麼SIMD指令不在內核中使用?

Q1)任何具體原因或只是缺少用例? Q2)如果我想使用SIMD指令,比如設備驅動程序,那麼今天需要做什麼? Q3)將ISPC這樣的框架納入內核(僅用於實驗)有多難?

回答

5

保存/恢復FPU(包括SIMD向量寄存器)狀態比僅整數GP寄存器狀態更加昂貴。在大多數情況下,這根本不值得花費。

在Linux內核代碼中,您所要做的就是在您的代碼周圍調用kernel_fpu_begin()/kernel_fpu_end()。這是RAID驅動程序的功能。http://yarchive.net/comp/linux/kernel_fp.html


x86沒有任何面向未來的方式來保存/恢復一個或幾個向量寄存器。 (除了使用傳統SSE指令手動保存/恢復xmm寄存器,如果用戶空間的任何ymm/zmm寄存器的上半部分髒),可能導致SSE/AVX transition stalls on Intel CPUs

SSE工作的原因是,當英特爾想要引入AVX時,一些Windows驅動程序已經這樣做了,所以他們發明了轉換懲罰性的東西,而不是傳統的SSE指令將ymm寄存器的上128b清零。 (有關該設計決策的更多詳細信息,請參閱this)。因此,基本上,我們可以將Windows二進制驅動程序歸咎於SSE/AVX轉換懲罰混亂。

有關非x86體系結構的IDK,以及現有的SIMD指令集是否具有面向未來的保存/恢復寄存器的方法,該寄存器將繼續適用於更長的向量。如果擴展繼續使用多個32位FP寄存器作爲單個更寬的寄存器,則ARM32可能會繼續。 (例如,q2s8s11組成)。因此,如果256b NEON擴展只允許使用2個q寄存器作爲一個256b寄存器,那麼保存/恢復一對q寄存器應該是面向未來的。或者如果新的更寬的向量是分開的,並且不擴展現有的寄存器。

+0

相關:[memcpy在linux中移動128位](https://stackoverflow.com/a/34011852/224132)。我的回答也提到'kernel_fpu_end()'實際上在Linux 3.7和更高版本中對FPU狀態進行了「熱切」恢復,所以不要在小塊工作中使用多個開始/結束調用。 –

相關問題