如何掌握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寄存器使用的疑惑?