自編教材分享:第二章—程序性能的度量指標(biāo)及優(yōu)化流程



在進(jìn)行程序優(yōu)化之前,了解統(tǒng)一的程序性能度量指標(biāo)以及常用的程序優(yōu)化流程是十分有必要的,其中程序性能度量指標(biāo)可以更好地幫助優(yōu)化人員衡量程序的性能。本文主要分享程序性能的度量指標(biāo)及優(yōu)化流程。
程序性能的度量指標(biāo)
程序性能的度量指標(biāo)主要包括程序執(zhí)行時(shí)間、計(jì)算與訪存效率、吞吐量與延遲、加速比、Amdahl定律、Gustafson定律等指標(biāo)。下面將一一介紹。
程序執(zhí)行時(shí)間
程序的執(zhí)行時(shí)間是判斷程序性能優(yōu)劣較為簡(jiǎn)單的方式之一,在使用相同計(jì)算設(shè)備且保證程序正確的前提下,程序運(yùn)行時(shí)間越短意味著其性能越高效。
實(shí)際優(yōu)化過(guò)程中,某些情況下需要對(duì)少量代碼精確計(jì)時(shí),采用普通的計(jì)時(shí)方法測(cè)試的結(jié)果誤差可能較大,此時(shí)可利用嵌入?yún)R編rpcc指令或多次執(zhí)行后取平均值的方式盡量減少結(jié)果誤差。
計(jì)算與訪存效率
計(jì)算效率是指實(shí)測(cè)浮點(diǎn)性能與理論浮點(diǎn)峰值性能之比。而訪存效率是指程序的有效訪存帶寬與存儲(chǔ)器理論帶寬之比,其中帶寬是計(jì)算平臺(tái)每秒內(nèi)存交換量的最大值。
當(dāng)程序的訪存效率接近于1時(shí),說(shuō)明程序已經(jīng)將整個(gè)存取器的帶寬都利用了起來(lái),與之對(duì)應(yīng)的當(dāng)訪存效率遠(yuǎn)小于1,則說(shuō)明存儲(chǔ)帶寬利用率較低,程序還有一定的訪存優(yōu)化空間。
吞吐量與延遲
吞吐量和延遲是衡量軟件系統(tǒng)最常見(jiàn)的兩個(gè)指標(biāo)。但高吞吐量并不意味著低延遲,高延遲也不代表吞吐量變小,它們之間的關(guān)系并不是簡(jiǎn)單的一一對(duì)應(yīng)。延遲測(cè)量的是用于等待的時(shí)間,廣義來(lái)說(shuō),延遲可以表示所有操作完成的耗時(shí),例如一次應(yīng)用程序請(qǐng)求、一次數(shù)據(jù)庫(kù)查詢、一次文件系統(tǒng)操作等,可以表示從單擊鏈接到屏幕顯示整個(gè)頁(yè)面加載完成的時(shí)間。
加速比
加速比speedup是指同一個(gè)任務(wù)在單處理器系統(tǒng)和并行處理器系統(tǒng)中運(yùn)行消耗的時(shí)間的比率,用來(lái)衡量并行系統(tǒng)或程序并行化的效果,也可以用于衡量程序優(yōu)化前后的效果,由于加速比是一個(gè)相對(duì)比值,因此在保證程序正確性的前提下加速比數(shù)值越大,代表著優(yōu)化的效果越顯著。 計(jì)算加速比的公式為:
Amdahl定律
Amdahl定律將程序劃分為可加速與不可加速兩大部分,程序總的加速比S是一個(gè)關(guān)于程序中這兩部分所占比例以及可加速部分性能加速程度的函數(shù),用公式表示為:
其中a為并行計(jì)算部分所占比例,n為并行計(jì)算部分獲得的加速比。例如當(dāng)a=50%,n=1.15時(shí),S=1/((1-0.50) + (0.50/1.15)) = 1/(0.50 + 0.43) = 1.08。若應(yīng)用程序有50%的代碼是串行部分,那么該程序最終所能夠達(dá)到的加速比上限為1/0.5=2。
Gustafson定律
對(duì)于某些不屬于固定負(fù)載模式的問(wèn)題不能使用Amdahl定律來(lái)解釋。早在1988年Gustafson就發(fā)現(xiàn)了這個(gè)問(wèn)題并提出了固定時(shí)間加速比模型,也就是經(jīng)常提及的擴(kuò)展加速比模型,通常被稱為Gustafson定律,其公式為:
其中S表示擴(kuò)展加速比,f表示處理器核的數(shù)量,n表示程序中串行部分的比例。
程序性能優(yōu)化常用流程
在進(jìn)行程序優(yōu)化時(shí)之前,除需要了解程序性能常用的度量指標(biāo)外,優(yōu)化人員還需要大致了解程序優(yōu)化的流程及具體實(shí)施步驟,從而可以更加高效順利的開(kāi)展程序優(yōu)化。程序性能的常用優(yōu)化流程如圖1所示。

案例
以矩陣乘優(yōu)化為例,假設(shè)優(yōu)化后相比優(yōu)化前需要達(dá)到1.5倍的性能目標(biāo)。在確立性能目標(biāo)后,需要對(duì)程序進(jìn)行性能度量,獲得程序運(yùn)行時(shí)的各方面的數(shù)據(jù)。
初始
初始運(yùn)行時(shí)間:
當(dāng)計(jì)算規(guī)模是1024*1024的時(shí)候,測(cè)出來(lái)的數(shù)據(jù)中最耗時(shí)的函數(shù)是matrixmulti。所以主要針對(duì)這個(gè)函數(shù)進(jìn)行優(yōu)化。

Matrixmulti函數(shù)初始代碼為:
循環(huán)交換
完成一次性能優(yōu)化后,程序員需要判斷當(dāng)前的程序性能是否滿足需求,根據(jù)性能結(jié)果決定是否需要開(kāi)啟下一輪性能優(yōu)化,直至滿足最初的程序性能目標(biāo)后結(jié)束優(yōu)化流程。
進(jìn)行循環(huán)交換后的時(shí)間:

進(jìn)行循環(huán)交換后matrixmulti函數(shù)的代碼為:
循環(huán)展開(kāi)
接下來(lái)使用循環(huán)展開(kāi)進(jìn)行優(yōu)化,把最內(nèi)層的循環(huán)展開(kāi)四次,它的程序的運(yùn)行時(shí)間此時(shí)就已經(jīng)達(dá)到2.04秒,加速比已經(jīng)達(dá)到1.56倍。滿足最初的優(yōu)化目標(biāo),結(jié)束優(yōu)化流程。

進(jìn)行循環(huán)展開(kāi)后matrixmulti函數(shù)的代碼為:
參考資料
AI框架發(fā)展白皮書(shū)(2022年) https://syncedreview.com/2020/12/14/a-brief-history-of-deep-learning-frameworks/
