引用:
作者----
沒有什麼最佳化 他只是把應用程式編譯後 加入那個指令集的opcode而已
|
喔..真的是這樣嗎...
讓我們來看個stackoverflow上平易近人的
範例
當然怕有人只看的懂opcode看不懂程式
所以簡單說明一下那個問答的內容
發問者寫了一段簡單的程式,會將A陣列中亂數產生的32bit浮點數,開三次平方根後存到B陣列
使用了三種方法來進行計算..
1.傳統的x87 (一次處理一組32b浮點數)
2.SSE(一次處理四組32b浮點數) 及
3.AVX (一次處理八組32b浮點數)
而執行後SSE的確較傳統X87有可觀的效能增長,但AVX執行效能卻等同於SSE,為什麼呢?
原因是因為,程式編譯後分別是呼叫 SQRTPS(SSE) VSQRTPS(AVX)兩組opcode來執行
根據此份
文件中 Page 98 所述,VSQRTPS 的 Latency 為 42 ,是 SQRTPS 的 Latency 21 的兩倍,
所以兩兩相抵之下沒有明顯的效能增益。
另外也提到了AVX指令集在除法跟開根號並沒有太大的效能增益,在加法及乘法上面就有了。
當然這是 2012年初 SB 的狀況,也許現在沒這情況了,但僅在提供一個簡單的範例而已。
故,壓根不是什麼編譯器加入opcode就是所謂的最佳化,
要如何使用AVX指令集去優化程式中的加乘法部分,甚至改變演算法減少除法及開根號的比重。
這些都是要靠開發人員用腦袋去安排思考的,最好是只靠編譯器加入opcode就好
