亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2017-08-07 14:27:36李忠武
        電子測(cè)試 2017年10期
        關(guān)鍵詞:指令技巧優(yōu)化

        李忠武

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

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

        李忠武

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

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

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

        0 引言

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

        1 基本優(yōu)化

        下面列出了一些常用于提高X86匯編語(yǔ)言代碼性能的基本優(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)展開(kāi)(或者部分展開(kāi))循環(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ù)

        使用匯編語(yǔ)言進(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也可能帶來(lái)性能問(wèn)題。下面的優(yōu)化技巧能最小化分支指令對(duì)性能的影響,并且提高分支預(yù)測(cè)單元的準(zhǔn)確性。

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

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

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

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

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

        (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包含了一小段匯編語(yǔ)言函數(shù),展示了這些實(shí)踐經(jīng)驗(yàn)的細(xì)節(jié)。

        清單1 使用符合靜態(tài)分支預(yù)測(cè)算法的條件跳轉(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

        ;簡(jiǎn)單的數(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)的性能帶來(lái)負(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器指令和庫(kù)函數(shù),以對(duì)齊高層代碼分配的數(shù)據(jù)項(xiàng)。例如_declspec(align(n))指示器和_aligned_ malloc函數(shù)能用來(lái)正確地對(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)使用無(wú)時(shí)態(tài)存儲(chǔ)指令(如movntdqa、movntpd、movntps等),以最小化緩存污染。

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

        6 結(jié)束語(yǔ)

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

        [1] Kusswurm,D.現(xiàn)代X86匯編語(yǔ)言程序設(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

        猜你喜歡
        指令技巧優(yōu)化
        聽(tīng)我指令:大催眠術(shù)
        超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
        肉兔短期增肥有技巧
        民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
        關(guān)于優(yōu)化消防安全告知承諾的一些思考
        一道優(yōu)化題的幾何解法
        開(kāi)好家長(zhǎng)會(huì)的幾點(diǎn)技巧
        甘肅教育(2020年12期)2020-04-13 06:24:46
        ARINC661顯控指令快速驗(yàn)證方法
        LED照明產(chǎn)品歐盟ErP指令要求解讀
        指正要有技巧
        国产午夜无码视频免费网站| 亚洲深深色噜噜狠狠网站| 国产福利视频一区二区| 中文字幕精品久久久久人妻红杏1| 亚洲日本在线va中文字幕| 97超碰中文字幕久久| 欧美精品无码一区二区三区| 中文字幕天天躁日日躁狠狠躁免费| 国产一区二区精品在线观看| 亚洲视频精品一区二区三区| 国产91传媒一区二区三区| 色噜噜狠狠狠综合曰曰曰| 国产精品亚洲欧美天海翼| 日本久久一级二级三级| 久久人人爽人人爽人人av| 99视频一区二区日本| 亚洲av无码国产精品色午夜软件| 337p西西人体大胆瓣开下部| 久久青草免费视频| 国产自产在线视频一区| 无码专区一ⅴa亚洲v天堂| 亚洲av无码精品国产成人| 日本韩无专砖码高清| 亚洲午夜无码久久久久软件| 国产精品性色av麻豆| 香港台湾经典三级a视频| 国产啪精品视频网站丝袜| 热热久久超碰精品中文字幕| 亚洲国产精品不卡av在线| 黑人巨茎大战欧美白妇| 加勒比黑人在线| 亚洲国产最新免费av| 亚洲视频在线观看| 久久中文字幕乱码免费| 日本视频一区二区三区免费观看 | 免费女女同黄毛片av网站| 国产精品区一区二区三在线播放| 在线观看国产精品日韩av| 精品视频在线观看一区二区有| 美利坚日韩av手机在线| 久久丫精品国产亚洲av不卡|