標籤:

如何掌握Intel Intrinsic Instruction?

想了解一下Intrinsic(為了提高代碼的效率),但看到https://software.intel.com/sites/landingpage/IntrinsicsGuide/中的指令多如牛毛,無從下手,想請教一下如何快速找到需要的指令,並編寫出高效的代碼?使用Intrinsic中有哪些需要注意的地方?


先要了解各個指令及常見用法,例如讀[1][2]。

[1] Intel? 64 and IA-32 Architectures Optimization Reference Manual

[2] Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X


強烈推薦閱讀 GitHub - Microsoft/DirectXMath: DirectXMath is an all inline SIMD C++ linear algebra library for use in games and graphics apps 源代碼,然後跟著寫一個。


按照次序一般分為load,數據重排,計算,再重排,save 這幾步。

可以結合自己需要的運算找到需要的操作拼裝起來即可。

stack overflow上有篇rgb24轉rgb32的文章,你可以找來看看作為入門。


這網站這麼好你還無從下手?

左上角篩選指令集,左下角篩選分類,函數名字總算是比較通俗易懂了吧,點開還有詳細的各個架構的延遲和吞吐率(很多指令broadwell和skylake似乎沒有更新上去)。

你如果不知道要用哪條指令,是因為能完成功能的選擇太多無從下手,還是連哪些指令能完成自己功能都不清楚?

如果是前者,profile吧,這東西有些時候是玄學。有精力的去看intel的那個manual,高贊答案里有,裡面有很多優化的思路和準則還有坑。

如果是後者,我覺得你可能需要先把自己的演算法理清楚。

像dpps求點積、sse4.2字元串比較查找這類的完成複雜功能的指令是不多的,不能想著一條指令完事。很多時候還是得靠好多指令堆疊起來,完成數學、邏輯的運算(以及無可避免的數據的搬運重組)

不過,我個人其實不太推薦直接看manual,內容很多,而且對彙編之類的要求也不低。套用那句俗氣的話,對大多數而言,還不輪不到需要了解這個pdf內容的程度。

對了,比較性能要用release,不然debug下似乎容易主動加入store指令,反而顯得效率很低。


最近也在學這個,我是先看懂它的命名規則,知道每個修飾符是什麼意思或作用。然後把那麼多指令分成幾大類,然後需要啥就去找啥,再細看所需指令的具體


intel的simd指令集有很多種,從最初的MMX,到SSE,再到AVX。它們的寄存器長度從64,128再到256。其中目前幾乎所有的CPU都支持SSE。你可以用SSE或者AVX作為關鍵詞找到很多有用的資料和實例學習。我曾經用這種些指令集優化幾千行代碼。不過手機打字,沒有辦法提供更多資料鏈接,抱歉。


我覺得首先要看懂它的命名規則,很多前綴、後綴都是不同的數據類型,這一點弄清楚了就不會覺得太亂,然後再通讀一遍各類函數的介紹,如果英語沒問題就比較容易理解,望文生義也能猜出來每個函數是做什麼的,再仔細看看這個函數的具體敘述,應該就知道什麼時候用、怎麼用了。


推薦閱讀:

如果說 RISC 的性能不如 CISC,那為什麼很多超算是 RISC 架構的?
x86 結構會被 ARM 結構淘汰嗎?
如何評價微軟在WinHEC 2016大會上演示的基於ARM的完整版Windows 10?
龍芯採用intel x86的指令界面,也算是侵權嗎?
x86寄存器使用的疑惑?

TAG:x86 | CC |