999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于匯編語言教學中優化語言代碼方法探討與研究

2017-08-07 14:27:36李忠武
電子測試 2017年10期
關鍵詞:指令技巧優化

李忠武

(保山學院,云南保山,678000)

基于匯編語言教學中優化語言代碼方法探討與研究

李忠武

(保山學院,云南保山,678000)

本文討論一些優化X86匯編語言代碼的簡單編程技巧。建議把這些技巧應用在運行于Intel最新微架構(包括Haswell、Sandy Bridge和Nehalem)代碼中。大多數技巧同樣適用于更早的微架構。可以把優化技巧和輔助性的指導方針分為五大類:基本優化、浮點算術、程序分支、數據對齊、SIMD技巧。

基本優化;浮點算術;程序分支;數據對齊;SIMD技巧

0 引言

需要謹記的一個要點是,接下來的基本優化、浮點算術、程序分支、數據對齊、SIMD技巧優化技巧都必須謹慎使用。[1]例如,如果僅為避免使用不推薦的指令形式一次,就增加多條額外的push和pop指令,那么是沒有意義的。

1 基本優化

下面列出了一些常用于提高X86匯編語言代碼性能的基本優化技巧。

(1)盡可能使用test指令,而不是cmp指令。

(2)盡可能避免使用內存與立即數形式的cmp和test指令(例如,cmp dword ptr[ebp+16],100或者test byte ptr[r12],0fh)。最好先將內存值載入寄存器,然后使用寄存器與立即數形式的cmp和test指令(如mov eax,dword ptr[ebp+16],接著cmp eax,100)。

(3)使用add或者sub指令,而不是inc或者dec指令,特別是在性能關鍵的循環中。后面的兩個指令不會更新EFLAGS寄存器中的所有標志位,通常會慢一些。

(4)使用or、sub、pxor、xorps等指令將一個寄存器置0,而不是用數據傳送指令。例如,xor eax,eax和xorps xmm0, xmm0比mov eax,0和movaps xmm0,xmmword ptr[XmmZero]要好。

(5)在所有操作數寬度前綴的指令中,避免使用16位立即數,而應該使用對應的32位或者8位立即數。例如,使用mov edx,42而不是mov dx,42。

(6)展開(或者部分展開)循環次數是常數的小循環。(7)將在計算中多次使用的內存值載入寄存器。如果一個內存值只在一次計算中用到,用寄存器到內存形式的計算指令。如表1顯示了幾個例子。

表1 一次使用和多次使用內存值的指令形式

下面優化技巧適用于x86-64代碼。

(1)當操作數是32時,使用32位通用寄存器和指令形式。

(2)操作32位寬數值時,優先使用通用寄存器EAX、ECX、EDX、ESI、EDI,而不是寄存器R8D-R15D。對于后面的寄存器組,指令解碼要多一個字節。

(3)利用額外的通用寄存器和SIMD寄存器,以減少數據依賴和寄存器溢出。

(4)如果不需要完成的128位結果,用兩操作數或三制作數形式的imul指令進行兩個64位整數乘法。

2 浮點算術

使用匯編語言進行浮點算術運算時,應考慮下面的指導方針:首先,在新代碼中使用x86-SSE或者x86-AVX而不是x86 FPU的標題浮點指令;其次,在算術運算中,盡可能避免算術下溢和非正規值;三是避免使用非正規浮點常量;最后是如果預知會有多次算術下溢,考慮啟用清洗到零(MXCSR.FZ)和非正規為零(MXCSR.DAX)模式。

3 程序分支

程序分支指令如jmp、call和ret在執行時是潛在的耗時操作,因為它們可能影響前端流水線和內部緩存的內容。考慮到使用的頻率,條件跳轉指令jcc也可能帶來性能問題。下面的優化技巧能最小化分支指令對性能的影響,并且提高分支預測單元的準確性。

(1)組織代碼,盡量少使用分支指令。

(2)使用setcc和cmovcc指令,以消除不可預測的數據相關的分支。

(3)在性能關鍵的循環中,對齊分支目標的邊界到16字節。

(4)將不太可能執行的條件代碼(例如錯誤處理代碼)移到另外的程序段或內存頁。

當預測一個分支語句的目標時,分支預測單元采用靜態和動態技術。當包含條件跳轉指令的代碼能夠組織成與分支預測單元的靜態預測算法一致時,那么錯誤的分支預測就可以被最小化。

(1)當貫代碼可能被執行時,使用向前的條件跳轉。

(2)當貫穿代碼不可能被執行時,使用身后條件跳轉。

向前條件跳轉方法經常用在檢查函數參數的代碼塊中。向后條件跳轉技術可以用在程序循環代碼塊的底部(緊跟著一個計數器更新或者其他循環結束判斷)。清單1包含了一小段匯編語言函數,展示了這些實踐經驗的細節。

清單1 使用符合靜態分支預測算法的條件跳轉指令

model flat,c

code

;extern ”c” bool CalcReslut_(double* des,const double* src,int n);

CalcReslut_proc

push ebp

mov ebp,esp

push esi

push edi

;本代碼使用向前條件跳轉,因為貫穿的情況可能發生

mov edi,[ebp+8]

test edi,0fh

jnz Error

mov esi,[ebp+12]

test esi,0fh

jnz Error

test ecx,2

jl Error

test ecx,1

jnz Error

;簡單的數據處理循環

xor eax,eax

@@:movapd xmm0,xmmword ptr[esi+eax]

mulpd xmm0,xmm0

movapd xmmword ptr[edi+eax],xmm0

;本段代碼使用向后條件跳轉,因為貫穿的情況更不能發生

add eax,16

sub ecx,2

jnz @B

mov eax,1

pop edi

pop esi

pop dbp

ret

;錯誤處理代碼,不太可能執行

Error:xor eax,eax

pop edi

pop esi

pop ebp

ret

CalcReslut_ endp

end

4 數據對齊

操作對齊錯誤數據時,可能導致處理器介紹費額外的內存周期和執行更多微指令,這將會給整個系統的性能帶來負面影響。下面的數據對齊實踐應該被認為是普遍真理并一直遵守。

(1)將多字節整數和浮點數對齊到自然的邊界。

(2)將64、128和256位寬的組合數據對齊到它們本身的邊界。

(3)必要時填補數據結構,以保證正確對齊。

(4)使用恰當的編譯器指令和庫函數,以對齊高層代碼分配的數據項。例如_declspec(align(n))指示器和_aligned_ malloc函數能用來正確地對齊Visual C++函數中分配的數據項。[2]

(5)更多地使用存儲對齊,而不是加載對齊。

下面這些對齊技巧也推薦使用:將小數組和短字符串對齊安置在數據結構中,以避免緩存行分割。評估不同的數據布局對性能的影響,例如數組結構與結構數組。

5 SIMD技巧[3]

在任何函數中,用x86-SSE和x86-AVX計算資源時應該考察下面這些技巧是否適用。

(1)消除寄存器依賴,以利用執行引擎的多個執行單元。

(2)用組合的單精度浮點數代替雙精度浮點數。

(3)將多次使用的內存操作數和組織常量加載到寄存器。

(4)用對齊的傳送指令存儲和加載組織數據,例如movdqa、movaps、movapd等。

(5)用小的數據塊處理SIMD數組,以最大化重用駐留緩存數據。

(6)在x86-AVX代碼中,使用數據混合而不是數據重組。

(7)當需要避免x86-AVX到x86-SSE狀態遷移的損失時,使用vzeroupper指令。

(8)使用x86-AVX vgather指令的雙字形式,而不是四字形式。在數據要用到之前就完成需要的收集操作。

(9)下面的這些實踐可以用于提高特定算法性能(進行SIMD編碼和解碼操作):

(10)使用無時態存儲指令(如movntdqa、movntpd、movntps等),以最小化緩存污染。

(11)使用數據項預取指令(例如perfecht0,perfetchnta等),以通知處理器預期要使用的數據項。

6 結束語

使用匯編語言優化代碼是一件困難,而且技巧性很強的工作。很多編譯器能夠生成為處理器進行過特殊優化處理的代碼,一旦進行修改,這些特殊優化可能就會被破壞而失效。因此,在你決定使用自己的匯編代碼之前,一定要測試一下,到底是編譯器生成的那段代碼更好,還是你的更好。

[1] Kusswurm,D.現代X86匯編語言程序設計[M].北京:機械工業出版社,2016:446.

[2]黃永才.Visual C++程序設計[M].北京:清華大學出版社,2017:251.

[3]高偉.SIMD自動向量化編譯優化概述[J]. 軟件學報,2015,(6):1269-1276.

Discussion and Research on the method of optimizing language code in assembly language teaching

Li Zhongwu
(Baoshan college,Baoshan Yunan, 678000)

This article discusses some simple programming techniques for optimizing X86 assembly language code It is recommended that these techniques be applied to code running in the latest Intel micro architectures (including Haswell, Sandy, Bridge, and Nehalem) Most techniques apply equally well to earlier architectures. Tuning and assistive guidelines can be divided into five broad categories: basic optimization, floating point arithmetic, program branching, data alignment, and SIMD techniques

basic optimizations; floating-point arithmetic; program branches; data alignment; SIMD techniques

猜你喜歡
指令技巧優化
聽我指令:大催眠術
超限高層建筑結構設計與優化思考
房地產導刊(2022年5期)2022-06-01 06:20:14
肉兔短期增肥有技巧
今日農業(2021年1期)2021-11-26 07:00:56
民用建筑防煙排煙設計優化探討
關于優化消防安全告知承諾的一些思考
一道優化題的幾何解法
開好家長會的幾點技巧
甘肅教育(2020年12期)2020-04-13 06:24:46
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
指正要有技巧
主站蜘蛛池模板: 国产精品对白刺激| 午夜精品久久久久久久无码软件 | 国产成人区在线观看视频| 婷婷六月色| 永久在线播放| 最新亚洲av女人的天堂| 一级毛片免费的| 中文字幕亚洲综久久2021| 欧美日韩精品在线播放| 亚洲第一区在线| 青青国产成人免费精品视频| 亚洲国产日韩在线成人蜜芽| 性视频一区| 亚洲国产系列| 精品人妻一区无码视频| 国产微拍一区二区三区四区| 亚洲人成网站观看在线观看| 国产女主播一区| a毛片在线| 亚洲综合色区在线播放2019| 美女无遮挡拍拍拍免费视频| 国产福利小视频高清在线观看| 国产精品视频观看裸模| 中文字幕不卡免费高清视频| 美女免费黄网站| 91福利在线看| 另类重口100页在线播放| 色婷婷综合在线| 亚洲AV色香蕉一区二区| 深爱婷婷激情网| 亚洲AV色香蕉一区二区| 亚洲视频欧美不卡| 亚洲动漫h| 国产视频一区二区在线观看| 亚洲无码高清免费视频亚洲| 日本国产精品| 99视频免费观看| 天天综合网色| 中文字幕无码中文字幕有码在线| 人妻出轨无码中文一区二区| 国产精品一区二区国产主播| 一区二区偷拍美女撒尿视频| 这里只有精品免费视频| 亚洲精品午夜无码电影网| 亚洲日韩精品无码专区97| 久久久久青草大香线综合精品| 女人爽到高潮免费视频大全| 久久综合五月婷婷| 亚洲天堂网视频| 欧美综合中文字幕久久| 午夜精品福利影院| 国产免费怡红院视频| 亚洲一欧洲中文字幕在线| 最新无码专区超级碰碰碰| 一级毛片在线免费看| 国产成人三级| 国模沟沟一区二区三区| 日本午夜精品一本在线观看| 在线不卡免费视频| 中文毛片无遮挡播放免费| 伊人天堂网| 91色爱欧美精品www| 国产精品无码影视久久久久久久| 国内精品久久久久久久久久影视| 99久久人妻精品免费二区| 亚洲av无码牛牛影视在线二区| 亚洲男人的天堂久久香蕉网| 最新日本中文字幕| a级毛片网| 成人字幕网视频在线观看| 国产哺乳奶水91在线播放| 久久久久无码精品| 欧美区国产区| 伊人色在线视频| 日本三级黄在线观看| 亚洲精品自产拍在线观看APP| 国产一级二级在线观看| 欧美精品在线免费| 国产精品污视频| 美臀人妻中出中文字幕在线| 色男人的天堂久久综合| 国产高潮视频在线观看|