• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于匯編語言教學(xué)中優(yōu)化語言代碼方法探討與研究

      2017-08-07 14:27:36李忠武
      電子測試 2017年10期
      關(guān)鍵詞:匯編語言浮點(diǎn)寄存器

      李忠武

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

      基于匯編語言教學(xué)中優(yōu)化語言代碼方法探討與研究

      李忠武

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

      本文討論一些優(yōu)化X86匯編語言代碼的簡單編程技巧。建議把這些技巧應(yīng)用在運(yùn)行于Intel最新微架構(gòu)(包括Haswell、Sandy Bridge和Nehalem)代碼中。大多數(shù)技巧同樣適用于更早的微架構(gòu)??梢园褍?yōu)化技巧和輔助性的指導(dǎo)方針分為五大類:基本優(yōu)化、浮點(diǎn)算術(shù)、程序分支、數(shù)據(jù)對(duì)齊、SIMD技巧。

      基本優(yōu)化;浮點(diǎn)算術(shù);程序分支;數(shù)據(jù)對(duì)齊;SIMD技巧

      0 引言

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

      1 基本優(yōu)化

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

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

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

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

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

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

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

      表1 一次使用和多次使用內(nèi)存值的指令形式

      下面優(yōu)化技巧適用于x86-64代碼。

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

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

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

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

      2 浮點(diǎn)算術(shù)

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

      3 程序分支

      程序分支指令如jmp、call和ret在執(zhí)行時(shí)是潛在的耗時(shí)操作,因?yàn)樗鼈兛赡苡绊懬岸肆魉€和內(nèi)部緩存的內(nèi)容??紤]到使用的頻率,條件跳轉(zhuǎn)指令jcc也可能帶來性能問題。下面的優(yōu)化技巧能最小化分支指令對(duì)性能的影響,并且提高分支預(yù)測單元的準(zhǔn)確性。

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

      (2)使用setcc和cmovcc指令,以消除不可預(yù)測的數(shù)據(jù)相關(guān)的分支。

      (3)在性能關(guān)鍵的循環(huán)中,對(duì)齊分支目標(biāo)的邊界到16字節(jié)。

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

      當(dāng)預(yù)測一個(gè)分支語句的目標(biāo)時(shí),分支預(yù)測單元采用靜態(tài)和動(dòng)態(tài)技術(shù)。當(dāng)包含條件跳轉(zhuǎn)指令的代碼能夠組織成與分支預(yù)測單元的靜態(tài)預(yù)測算法一致時(shí),那么錯(cuò)誤的分支預(yù)測就可以被最小化。

      (1)當(dāng)貫代碼可能被執(zhí)行時(shí),使用向前的條件跳轉(zhuǎn)。

      (2)當(dāng)貫穿代碼不可能被執(zhí)行時(shí),使用身后條件跳轉(zhuǎn)。

      向前條件跳轉(zhuǎn)方法經(jīng)常用在檢查函數(shù)參數(shù)的代碼塊中。向后條件跳轉(zhuǎn)技術(shù)可以用在程序循環(huán)代碼塊的底部(緊跟著一個(gè)計(jì)數(shù)器更新或者其他循環(huán)結(jié)束判斷)。清單1包含了一小段匯編語言函數(shù),展示了這些實(shí)踐經(jīng)驗(yàn)的細(xì)節(jié)。

      清單1 使用符合靜態(tài)分支預(yù)測算法的條件跳轉(zhuǎn)指令

      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

      ;本代碼使用向前條件跳轉(zhuǎn),因?yàn)樨灤┑那闆r可能發(fā)生

      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

      ;簡單的數(shù)據(jù)處理循環(huán)

      xor eax,eax

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

      mulpd xmm0,xmm0

      movapd xmmword ptr[edi+eax],xmm0

      ;本段代碼使用向后條件跳轉(zhuǎn),因?yàn)樨灤┑那闆r更不能發(fā)生

      add eax,16

      sub ecx,2

      jnz @B

      mov eax,1

      pop edi

      pop esi

      pop dbp

      ret

      ;錯(cuò)誤處理代碼,不太可能執(zhí)行

      Error:xor eax,eax

      pop edi

      pop esi

      pop ebp

      ret

      CalcReslut_ endp

      end

      4 數(shù)據(jù)對(duì)齊

      操作對(duì)齊錯(cuò)誤數(shù)據(jù)時(shí),可能導(dǎo)致處理器介紹費(fèi)額外的內(nèi)存周期和執(zhí)行更多微指令,這將會(huì)給整個(gè)系統(tǒng)的性能帶來負(fù)面影響。下面的數(shù)據(jù)對(duì)齊實(shí)踐應(yīng)該被認(rèn)為是普遍真理并一直遵守。

      (1)將多字節(jié)整數(shù)和浮點(diǎn)數(shù)對(duì)齊到自然的邊界。

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

      (3)必要時(shí)填補(bǔ)數(shù)據(jù)結(jié)構(gòu),以保證正確對(duì)齊。

      (4)使用恰當(dāng)?shù)木幾g器指令和庫函數(shù),以對(duì)齊高層代碼分配的數(shù)據(jù)項(xiàng)。例如_declspec(align(n))指示器和_aligned_ malloc函數(shù)能用來正確地對(duì)齊Visual C++函數(shù)中分配的數(shù)據(jù)項(xiàng)。[2]

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

      下面這些對(duì)齊技巧也推薦使用:將小數(shù)組和短字符串對(duì)齊安置在數(shù)據(jù)結(jié)構(gòu)中,以避免緩存行分割。評(píng)估不同的數(shù)據(jù)布局對(duì)性能的影響,例如數(shù)組結(jié)構(gòu)與結(jié)構(gòu)數(shù)組。

      5 SIMD技巧[3]

      在任何函數(shù)中,用x86-SSE和x86-AVX計(jì)算資源時(shí)應(yīng)該考察下面這些技巧是否適用。

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

      (2)用組合的單精度浮點(diǎn)數(shù)代替雙精度浮點(diǎn)數(shù)。

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

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

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

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

      (7)當(dāng)需要避免x86-AVX到x86-SSE狀態(tài)遷移的損失時(shí),使用vzeroupper指令。

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

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

      (10)使用無時(shí)態(tài)存儲(chǔ)指令(如movntdqa、movntpd、movntps等),以最小化緩存污染。

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

      6 結(jié)束語

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

      [1] Kusswurm,D.現(xiàn)代X86匯編語言程序設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2016:446.

      [2]黃永才.Visual C++程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2017:251.

      [3]高偉.SIMD自動(dòng)向量化編譯優(yōu)化概述[J]. 軟件學(xué)報(bào),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

      猜你喜歡
      匯編語言浮點(diǎn)寄存器
      LEO星座增強(qiáng)GNSS PPP模糊度浮點(diǎn)解與固定解性能評(píng)估
      高等學(xué)校計(jì)算機(jī)專業(yè)課程教學(xué)改革實(shí)踐——以匯編語言與接口技術(shù)課程為例
      Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
      基于浮點(diǎn)DSP的鐵路FSK信號(hào)檢測
      匯編語言與C語言的混合程序設(shè)計(jì)技術(shù)研究
      電子制作(2019年10期)2019-06-17 11:45:16
      提高《匯編語言程序設(shè)計(jì)》教學(xué)效率的思考與實(shí)踐
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      基于FPGA的浮點(diǎn)FIR濾波器設(shè)計(jì)
      改進(jìn)的Goldschmidt雙精度浮點(diǎn)除法器
      高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
      阳高县| 宝应县| 忻城县| 彭水| 楚雄市| 赤水市| 称多县| 肥乡县| 绥滨县| 邹城市| 山西省| 濉溪县| 武平县| 蚌埠市| 柳河县| 南昌市| 咸阳市| 洪雅县| 叙永县| 汝阳县| 东兰县| 江北区| 长乐市| 深泽县| 迭部县| 灵川县| 获嘉县| 泰顺县| 清原| 沙洋县| 文登市| 太湖县| 尼勒克县| 绥宁县| 潜江市| 衡山县| 金湖县| 海南省| 舒城县| 长治县| 新泰市|