• 
    

    
    

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

      ?

      基于CUPTI接口的典型GPU程序負(fù)載特征分析

      2016-07-19 02:14:14翟季冬陳文光
      關(guān)鍵詞:性能指標(biāo)

      鄭 禎 翟季冬 李 焱 陳文光

      (清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系 北京 100084)(z-zheng14@mails.tsinghua.edu.cn)

      ?

      基于CUPTI接口的典型GPU程序負(fù)載特征分析

      鄭禎翟季冬李焱陳文光

      (清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系北京100084)(z-zheng14@mails.tsinghua.edu.cn)

      摘要基于圖形處理器(graphics processing unit, GPU)加速設(shè)備的高性能計(jì)算機(jī)已經(jīng)成為目前高性能計(jì)算領(lǐng)域的一個(gè)重要發(fā)展趨勢.然而,在當(dāng)前的GPU設(shè)備上開發(fā)高效的并行程序仍然是一件非常復(fù)雜的事情.針對(duì)這一問題,1)總結(jié)了影響GPU程序性能的5類關(guān)鍵性能指標(biāo);2)采用NVIDIA公司提供的CUPTI底層接口,設(shè)計(jì)并實(shí)現(xiàn)了一套GPU程序性能分析工具集,該工具集可以有效地分析GPU程序的性能行為;3)采用該工具集對(duì)著名的GPU評(píng)測程序集Rodinia中的17個(gè)程序和一個(gè)真實(shí)應(yīng)用程序進(jìn)行了負(fù)載特征分析.總結(jié)出常見性能瓶頸的典型原因,并給出一些開發(fā)高效GPU程序的建議.

      關(guān)鍵詞圖形處理器;負(fù)載特征分析;Rodinia;硬件計(jì)數(shù)器;性能指標(biāo)

      近年來,基于加速設(shè)備的超級(jí)計(jì)算機(jī)已經(jīng)成為高性能計(jì)算領(lǐng)域一個(gè)重要發(fā)展趨勢.在2014年6月最新發(fā)布的超級(jí)計(jì)算機(jī)TOP500排名中,有48個(gè)計(jì)算機(jī)系統(tǒng)使用了GPU加速器.其中,在前15位的超級(jí)計(jì)算機(jī)中有5個(gè)計(jì)算機(jī)使用了GPU加速器.目前,NVIDIA公司的GPU是最主流的GPU加速器,在上述TOP500中有48個(gè)使用GPU加速器的超級(jí)計(jì)算機(jī)中,有46個(gè)使用的是NVIDIA架構(gòu)的GPU,其余2個(gè)使用了AMD的GPU.

      盡管基于加速設(shè)備的超級(jí)計(jì)算機(jī)變得越來越流行,但是,在這些系統(tǒng)上編寫高效率的并行程序仍然是一件非常復(fù)雜的事情.我們以NVIDIA的GPU設(shè)備為例,NVIDIA公司推出的通用編程框架CUDA(compute unified device architecture)是目前應(yīng)用最為廣泛的編程模型,但編寫高效的CUDA程序非常困難.一方面,GPU設(shè)備的存儲(chǔ)器層次結(jié)構(gòu)較為復(fù)雜,除了片外的全局存儲(chǔ)器(global memory)、常數(shù)存儲(chǔ)器(constant memory)和紋理存儲(chǔ)器(texture memory)之外,GPU還向應(yīng)用開發(fā)人員開放了對(duì)片內(nèi)的共享存儲(chǔ)器(shared memory)的訪問接口,這些存儲(chǔ)器都需要程序員在程序中顯示地進(jìn)行管理;另一方面,CUDA編程模型本身也提供多層次的程序組織方式,具有網(wǎng)格(grid)、線程塊(thread block)、warp等,不同組織形式下有不同的線程間通信機(jī)制和存儲(chǔ)器共享與訪問機(jī)制.這些復(fù)雜的編程機(jī)制導(dǎo)致GPU程序的編寫及優(yōu)化比較困難.

      針對(duì)GPU程序性能的瓶頸,目前國內(nèi)外研究人員提出了很多相關(guān)的優(yōu)化技術(shù).Zhang等人[1]提出了一種軟件的方法在運(yùn)行時(shí)優(yōu)化GPU程序中控制和訪存的不規(guī)則問題,但是目前該工作只支持簡單的訪存行為優(yōu)化,尚不支持較復(fù)雜的程序.Yang等人[2]提出一個(gè)基于指導(dǎo)編譯語句的方式優(yōu)化GPU程序中的嵌套并行.Margiolas等人[3]開發(fā)了一個(gè)可移植的框架優(yōu)化OpenCL程序中CPU和GPU之間通信傳輸開銷高的問題.Xiang等人[4]發(fā)現(xiàn)在GPU程序中不同warp間會(huì)存在顯著的負(fù)載不均衡現(xiàn)象,由于目前GPU的warp調(diào)度方式會(huì)導(dǎo)致GPU資源的顯著浪費(fèi),針對(duì)上述問題他們提出一種新的資源管理方式,可以有效提高GPU程序性能并降低系統(tǒng)的整體能耗.盡管已有大量的研究工作試圖自動(dòng)優(yōu)化GPU程序的各種性能行為,但是,缺少對(duì)典型GPU程序的負(fù)載特征的詳細(xì)分析和總結(jié).

      為了有效分析當(dāng)前典型GPU程序的負(fù)載特征,本文首先歸納出GPU程序若干重要性能指標(biāo),其中包括計(jì)算訪存比、實(shí)際浮點(diǎn)性能、帶寬利用率、GPU占用率、共享存儲(chǔ)器訪問效率、全局存儲(chǔ)器訪問效率等.并且,為了有效獲取GPU程序的上述指標(biāo),我們采用NVIDIA公司提供的底層CUPTI接口(CUDA profiling tools interface)自主開發(fā)了一套性能分析工具,該工具可以在不修改用戶源碼的情況下精確獲取GPU程序上述性能指標(biāo).本文采用該工具集對(duì)著名的GPU評(píng)測程序集Rodinia[5]中17個(gè)程序和全球正壓大氣淺水波模式應(yīng)用程序[6]進(jìn)行了性能分析,統(tǒng)計(jì)了各個(gè)程序上述的性能指標(biāo),并對(duì)部分重要性能指標(biāo)表現(xiàn)的性能瓶頸進(jìn)行了程序優(yōu)化.本文的分析結(jié)果對(duì)CUDA程序優(yōu)化及未來GPU體系結(jié)構(gòu)的設(shè)計(jì)都具有指導(dǎo)意義.

      1相關(guān)工作

      目前已有一些工具可以進(jìn)行CUDA程序性能分析,但都存在一些不足.PAPI(performance application programming interface)[7]是應(yīng)用廣泛的程序性能分析工具,提供了針對(duì)CUDA程序的性能分析接口.使用PAPI接口在待測試程序代碼中進(jìn)行插裝,就可以得到CUDA程序的部分硬件計(jì)數(shù)器值.但如前所述,使用PAPI進(jìn)行性能測試時(shí)需要對(duì)源代碼進(jìn)行修改,這增加了性能測試工作的難度和繁瑣程度;另外,PAPI性能分析接口每次只能夠讀取少量的硬件計(jì)數(shù)器值,為得到大量硬件計(jì)數(shù)器值,需要多次修改插樁代碼并多次運(yùn)行.TAU(tuning and analysis utilities)[8]提供了功能更為強(qiáng)大的CUDA程序性能分析功能.該工具可以追蹤C(jī)UDA程序各種庫函數(shù)操作的執(zhí)行時(shí)間和具體執(zhí)行信息(如復(fù)制函數(shù)復(fù)制的字節(jié)數(shù)等),并能夠在不修改待測試程序源碼的情況下收集程序運(yùn)行時(shí)的硬件計(jì)數(shù)器指標(biāo)值.但在CUDA程序的1次運(yùn)行中,TAU只能夠收集少量的硬件計(jì)數(shù)器指標(biāo)值,為了收集較多的指標(biāo)值,需要手動(dòng)地多次執(zhí)行整個(gè)程序,使用較為繁瑣;另外,TAU只能收集單純的硬件計(jì)數(shù)器值,不能收集或計(jì)算綜合性能指標(biāo),而獨(dú)立的硬件計(jì)數(shù)器值難以直接反映程序的性能特性,這使得其性能分析結(jié)果難以引導(dǎo)開發(fā)者進(jìn)行性能優(yōu)化.Visual Profiler[9]是NVIDIA官方提供的CUDA性能分析工具.該工具提供可視化的操作界面,能夠收集GPU上所有的硬件計(jì)數(shù)器值,且能夠收集并計(jì)算一些綜合性能指標(biāo).但該工具對(duì)部分重要性能指標(biāo)默認(rèn)不做收集,而需要開發(fā)者進(jìn)行指標(biāo)的選擇,初級(jí)CUDA程序開發(fā)者難以選擇出重要的性能指標(biāo)并通過查看眾多性能指標(biāo)而快速確定程序性能瓶頸.

      目前已有一些CUDA程序優(yōu)化方法的研究.Yang等人[10]的工作中通過對(duì)10個(gè)開源CUDA程序的分析,總結(jié)了若干種導(dǎo)致程序性能低下的程序模式,并通過實(shí)驗(yàn)證明對(duì)這些程序模式的優(yōu)化能夠顯著提高程序性能.Stratton等人[11]的工作中描述了對(duì)CUDA程序優(yōu)化有關(guān)鍵作用的方法,包括數(shù)據(jù)存儲(chǔ)方式的轉(zhuǎn)換、合并訪問、負(fù)載均衡化、控制并行粒度等方法,這些優(yōu)化模式應(yīng)用在CUDA程序上有普遍的性能提高.Yang等人[12]的工作中提出了一個(gè)源到源的CUDA程序自動(dòng)優(yōu)化工具,其中采用的優(yōu)化方法包括向量化,全局內(nèi)存合并訪問,線程合并以及數(shù)據(jù)預(yù)取等方法.在Li等人[13]以及Chen等人[14]的工作中,研究了變量存儲(chǔ)位置轉(zhuǎn)換的問題.Li等人[13]的工作主要涉及到全局內(nèi)存和共享內(nèi)存變量轉(zhuǎn)換為寄存器變量,以及共享內(nèi)存變量轉(zhuǎn)換為全局內(nèi)存變量這幾個(gè)方面;Chen等人[14]的工作則側(cè)重于將全局內(nèi)存變量轉(zhuǎn)變?yōu)槠渌愋妥兞浚Y(jié)果顯示通過內(nèi)存變量位置的合理轉(zhuǎn)換,程序性能能夠得到很大的提升.Wahib等人[15]的工作中,提出了通過合并核函數(shù)的方式進(jìn)行數(shù)據(jù)重用的方法,被合并的核函數(shù)需要有共同的參數(shù),此時(shí)這些參數(shù)的訪問能夠被重用,實(shí)驗(yàn)顯示該方法對(duì)部分程序有很好的優(yōu)化效果.李建江等人[16]提出了一種將單GPU程序轉(zhuǎn)化為多GPU程序的方法,通過該轉(zhuǎn)化能夠使大型程序運(yùn)行在多GPU上,取得更好的加速效果.這些針對(duì)CUDA程序的研究都取得了一定的效果,但這些研究都側(cè)重于以具體的方法對(duì)某一類程序進(jìn)行優(yōu)化,并沒有對(duì)普通程序進(jìn)行性能瓶頸分析和定位.

      對(duì)常用CUDA程序做負(fù)載分析的相關(guān)工作較少.Che等人[5]的工作中,對(duì)基準(zhǔn)測試程序套件Rodinia進(jìn)行了多樣性分析,說明了Rodinia中程序能夠較為廣泛地覆蓋并行程序的特性,并分析了影響CUDA程序性能的一些問題,但該工作中并沒有研究反映CUDA程序性能特性的性能指標(biāo),也沒有針對(duì)CUDA重要性能特性對(duì)Rodinia做負(fù)載特征分析;同時(shí),該工作中只是對(duì)一套基準(zhǔn)測試程序套件進(jìn)行分析,沒有對(duì)真實(shí)應(yīng)用程序進(jìn)行性能分析.

      目前已有一些針對(duì)CUDA程序的部分特性進(jìn)行性能建模的工作.在Williams等人[17]提出的Roofline模型中,分析了實(shí)測浮點(diǎn)性能與理論浮點(diǎn)性能峰值、帶寬峰值及操作密度的函數(shù)關(guān)系.該模型中,操作密度是指單位字節(jié)的內(nèi)存數(shù)據(jù)傳輸之下的操作數(shù)量,為操作數(shù)量與訪存數(shù)量的比值,對(duì)于給定的操作密度,通過該模型可以確定程序是計(jì)算受限還是訪存受限.本論文中借鑒了該工作的方法,確立了計(jì)算訪存行為的性能指標(biāo).

      2CUDA程序性能指標(biāo)

      為了有效地分析CUDA程序的負(fù)載特征,明確程序的性能瓶頸,本文提出5類關(guān)鍵性能指標(biāo)描述CUDA程序的性能行為:

      1) 計(jì)算訪存行為(計(jì)算訪存比、實(shí)測浮點(diǎn)性能和帶寬利用率)

      計(jì)算訪存比對(duì)于確定程序的類型以及檢測程序性能受限因素有重要作用:①對(duì)基準(zhǔn)測試程序進(jìn)行計(jì)算訪存比測試可以統(tǒng)計(jì)出通用程序的計(jì)算訪存特征;②對(duì)于單個(gè)程序,綜合計(jì)算訪存比、GPU帶寬與帶寬利用率以及理論浮點(diǎn)性能峰值與實(shí)測浮點(diǎn)性能可以看出程序是訪存受限還是計(jì)算受限[17].科學(xué)計(jì)算中,大部分計(jì)算指令為浮點(diǎn)型指令,而通常影響程序性能的訪存方式主要是全局存儲(chǔ)器訪問,因此,統(tǒng)計(jì)浮點(diǎn)計(jì)算指令與全局存儲(chǔ)器訪存比更有意義.

      我們定義浮點(diǎn)計(jì)算與全局訪存比為浮點(diǎn)指令的條數(shù)與全局存儲(chǔ)器訪問字節(jié)數(shù)的比率,記為Rf-g,記浮點(diǎn)指令條數(shù)為If,核函數(shù)執(zhí)行時(shí)間為Dk,單位時(shí)間內(nèi)全局存儲(chǔ)器的讀與寫的字節(jié)數(shù)分別為Tgld與Tgst,則有:

      (1)

      由于我們收集的Tgld與Tgst為運(yùn)行時(shí)的指標(biāo),最終得到的全局存儲(chǔ)器訪問字節(jié)數(shù)也是實(shí)際值,而非理論值在作分析時(shí),理論的存儲(chǔ)器訪問量與實(shí)際值可能會(huì)有偏差.

      GPU實(shí)測浮點(diǎn)性能Pf-achieved是指GPU每秒實(shí)際執(zhí)行的浮點(diǎn)運(yùn)算次數(shù),浮點(diǎn)計(jì)算單元利用率Uf是指實(shí)測浮點(diǎn)性能與理論峰值Pf-peak的比率.這2個(gè)指標(biāo)能夠反映出程序的浮點(diǎn)計(jì)算量及浮點(diǎn)計(jì)算單元的利用情況,其計(jì)算方法為

      (2)

      (3)

      GPU帶寬利用率Udram可以通過指標(biāo)Tdramread,Tdramwrite以及GPU的帶寬B求得,其中Tdramread和Tdramwrite分別表示單位時(shí)間內(nèi)GPU設(shè)備上內(nèi)存讀寫字節(jié)數(shù).Udram能夠綜合地反映程序?qū)Υ鎯?chǔ)器訪問的效率,其計(jì)算方法為

      (4)

      2) GPU占用率

      GPU占用率(occupancy)是指實(shí)際運(yùn)行的warp占最大理論warp數(shù)量的比值,包括理論GPU占用率和實(shí)際GPU占用率.影響理論GPU占用率的指標(biāo)有3個(gè):每個(gè)線程塊中線程的數(shù)量、每個(gè)線程占用的寄存器數(shù)量和每個(gè)線程塊分配的共享存儲(chǔ)大小.實(shí)際GPU占用率由CUPTI中定義的achieved_occupancy來表示,該值受到每個(gè)網(wǎng)格中線程塊數(shù)量及實(shí)際運(yùn)行環(huán)境的影響,需要在程序運(yùn)行時(shí)通過CUPTI相關(guān)函數(shù)獲取.

      GPU占用率反映了程序?qū)嶋H開啟的并行計(jì)算線程數(shù)量占理論最大數(shù)量的比例,一般來說,比值越大表示程序?qū)PU資源的利用率越高,并行度越好.一方面,GPU占用率受開發(fā)者配置的并行線程數(shù)量的影響,開發(fā)者配置的線程數(shù)過少時(shí)GPU占用率會(huì)較低;另一方面,GPU占用率受單位線程占用的存儲(chǔ)器資源數(shù)量的影響,當(dāng)每個(gè)線程中局部變量較多從而占用較多寄存器時(shí),或者每個(gè)線程塊占用的共享內(nèi)存數(shù)量較多時(shí),會(huì)因?yàn)榇鎯?chǔ)器資源不足而無法發(fā)起太多線程,導(dǎo)致GPU占用率較低.GPU占用率可以反映程序在這2方面的特性.

      對(duì)于訪存受限的CUDA程序,當(dāng)其并行度較高時(shí),大量的線程并行執(zhí)行通常能夠有效地掩蓋數(shù)據(jù)傳輸帶來的時(shí)延,從而提高程序性能.因此GPU占用率是反映訪存受限的CUDA程序性能的重要指標(biāo).但對(duì)于計(jì)算密集型程序,單純提高GPU占用率并不能很有效地提高程序性能.

      3) 共享存儲(chǔ)器訪問效率

      反映共享存儲(chǔ)器訪問效率的指標(biāo)是shared_efficiency,表示對(duì)共享存儲(chǔ)器數(shù)據(jù)訪問的請求數(shù)據(jù)量與實(shí)際數(shù)據(jù)量的比率,其值越大表示共享存儲(chǔ)器訪問效率越高.

      在共享內(nèi)存的最佳訪問狀態(tài)下,每個(gè)half-warp中不同線程訪問到不同的bank中(或所有線程訪問同一地址),此時(shí)各個(gè)線程能夠同時(shí)訪問共享內(nèi)存,shared_efficiency=1.0;當(dāng)存在bank沖突時(shí),不同線程訪問到同一個(gè)bank時(shí)會(huì)使得各線程只能依次訪問,此時(shí)shared_efficiency降低.因此,shared_efficiency能夠反映出共享存儲(chǔ)器使用中的bank沖突(bank conflict),當(dāng)該指標(biāo)值較低時(shí),往往表示存在bank沖突.

      4) 全局存儲(chǔ)器訪問效率

      反映全局存儲(chǔ)器訪問效率的指標(biāo)是gld_efficiency和gst_efficiency.gld_efficiency的含義是對(duì)全局存儲(chǔ)器數(shù)據(jù)讀取的請求數(shù)據(jù)量與實(shí)際數(shù)據(jù)量的比率,其值越大表示讀取數(shù)值的效率越高,該比率可能小于1.0,可能等于1.0,也可能大于1.0.gst_efficiency表示對(duì)全局存儲(chǔ)器數(shù)據(jù)寫入的請求數(shù)據(jù)量與實(shí)際數(shù)據(jù)量的比率,與gld_efficiency的意義類似,值越大表示效率越高.

      全局內(nèi)存的最佳讀取方式是多個(gè)線程讀取同一地址,此時(shí)多個(gè)線程只需一次全局內(nèi)存讀取,gld_efficiency>1.0;當(dāng)同一個(gè)half-warp中的線程對(duì)全局內(nèi)存的讀取地址連續(xù)且滿足一定的地址對(duì)齊規(guī)則時(shí)(不同GPU架構(gòu)下對(duì)齊要求不同),該half-warp中各線程對(duì)全局內(nèi)存的讀取能夠合并為同一條讀取指令,此時(shí)gld_efficiency=1.0;當(dāng)half-warp中不同線程對(duì)全局內(nèi)存變量的訪問不連續(xù)或不滿足地址對(duì)齊規(guī)則時(shí),不同線程需多次讀取全局內(nèi)存,而CUDA中對(duì)全局內(nèi)存讀取時(shí)是以32 B,64 B或128 B為單位的,單次讀取單個(gè)變量時(shí)會(huì)讀入大量不需要的內(nèi)存,gld_efficiency<1.0.對(duì)于全局內(nèi)存的寫入和gst_efficiency有類似的結(jié)論.

      gld_efficiency和gst_efficiency可以有效地檢測出非合并訪問(uncoalesced access),對(duì)于測試CUDA程序全局存儲(chǔ)器訪問效率很有效.

      5) 線程束執(zhí)行效率

      線程束執(zhí)行效率主要由線程分歧的情況來反映.對(duì)于CUDA核函數(shù),當(dāng)分支條件控制指令數(shù)不大于某個(gè)閾值時(shí),編譯器會(huì)使用帶有謂詞的指令替換分支指令,各個(gè)線程會(huì)根據(jù)控制條件將各條替換過的分支指令與設(shè)置為true或false的謂詞相關(guān)聯(lián),此時(shí)每一條分支指令都會(huì)在任何一個(gè)線程中發(fā)射,但最終只有謂詞為true的指令才會(huì)被實(shí)際執(zhí)行;當(dāng)分支數(shù)大于閾值時(shí),編譯器不會(huì)進(jìn)行分支謂詞替換,此時(shí)同一half-warp中執(zhí)行不同分支的線程無法并行執(zhí)行,會(huì)出現(xiàn)一部分線程等待其他線程的情況.

      能夠反映核函數(shù)執(zhí)行過程中線程分歧的指標(biāo)是warp_execution_efficiency和warp_nonpred_execution_efficiency.warp_execution_efficiency是指在流處理器中各個(gè)warp中實(shí)際運(yùn)行的線程數(shù)量占最大理論線程數(shù)量的比值的平均值,該值為1.0時(shí)表示不考慮分支謂詞替換分支指令的情況下沒有線程分歧,否則一定有線程分歧.warp_nonpred_execution_efficiency是指在一個(gè)流處理器上各個(gè)warp中執(zhí)行非分支預(yù)測指令的線程數(shù)量占最大理論線程數(shù)量的比值的平均值,該值為1.0時(shí)表示沒有使用分支謂詞替換分支指令,否則存在分支預(yù)測.綜合2個(gè)指標(biāo)可以全面地了解核函數(shù)中的線程分歧情況.

      通過上述指標(biāo)的分析,可以清楚地了解CUDA程序的計(jì)算特征、訪存特征以及GPU特有的性能行為,例如,線程分歧和共享內(nèi)存使用情況.下面介紹本文如何通過GPU的CUPTI接口獲取上述性能指標(biāo).

      3性能工具的實(shí)現(xiàn)

      本文設(shè)計(jì)并實(shí)現(xiàn)的性能分析工具能夠在待測試程序運(yùn)行時(shí)收集第2節(jié)討論的重要性能指標(biāo),使用該工具時(shí)無需修改待測試程序源碼.為實(shí)現(xiàn)該工具,我們對(duì)CUDA運(yùn)行時(shí)庫函數(shù)進(jìn)行了插樁,重寫了部分關(guān)鍵的庫函數(shù),并通過設(shè)置LD_PRELOAD環(huán)境變量使得CUDA程序在調(diào)用庫函數(shù)時(shí)鏈接并執(zhí)行我們重新實(shí)現(xiàn)的版本,進(jìn)而在執(zhí)行時(shí)運(yùn)行采集性能指標(biāo)的程序段.對(duì)庫函數(shù)插樁前后核函數(shù)執(zhí)行流程如圖1所示:

      Fig. 1 The processes of the kernel before and after instrumentation.圖1 對(duì)庫函數(shù)插樁前后核函數(shù)執(zhí)行流程

      我們在插入的代碼中使用CUPTI接口[18]來收集CUDA程序的性能指標(biāo),CUPTI可以收集的指標(biāo)主要包括程序運(yùn)行信息、事件和CUPTI定義的Metric三類.其中,事件指GPU的硬件計(jì)數(shù)器值,而Metric則是由若干個(gè)事件值計(jì)算出的綜合性指標(biāo).在第3節(jié)中描述的重要性能指標(biāo)大部分可以直接由Metric來表示,另外一部分可以通過其他Metric求出,因此我們的目標(biāo)是收集需要的事件值,進(jìn)而得到重要的Metric值.

      為得到需要的重要Metric值而必須首先得到較多的事件值,而由于硬件計(jì)數(shù)器數(shù)量限制,每次核函數(shù)運(yùn)行時(shí)可以收集到的事件值數(shù)量有限,因此需要多次執(zhí)行核函數(shù),分多次收集事件值.為此,我們通過對(duì)庫函數(shù)插樁而改變了核函數(shù)的發(fā)射過程,使得原先一次執(zhí)行的核函數(shù)被多次發(fā)射,從而在每次執(zhí)行時(shí)求得一部分硬件計(jì)數(shù)器值,最終求出所有需要的性能指標(biāo)值.通過這樣的方式,核函數(shù)被多次執(zhí)行,而整個(gè)程序則仍然只需要執(zhí)行一次,且整個(gè)過程對(duì)使用者來說是透明的.核函數(shù)發(fā)射的控制函數(shù)主要是cudaConfigureCall,cudaSetupArgument,cudaLaunch,前兩者將核函數(shù)配置參數(shù)與運(yùn)行參數(shù)壓入棧中,后者發(fā)射核函數(shù),編譯時(shí)源程序中核函數(shù)調(diào)用語句會(huì)被這3個(gè)函數(shù)所替代.本文實(shí)現(xiàn)的性能分析工具重新實(shí)現(xiàn)了這3個(gè)函數(shù),在前兩者中備份了函數(shù)參數(shù),在新的cudaLaunch中多次調(diào)用原函數(shù)cudaLaunch,從而實(shí)現(xiàn)核函數(shù)的多次執(zhí)行,每次調(diào)用后收集若干事件值,在收集到所有所需事件值后得到所需的各個(gè)Metric值.為了保證多次調(diào)用核函數(shù)后程序的正確性,需要在每次調(diào)用cudaLaunch前恢復(fù)部分變量值為進(jìn)入核函數(shù)時(shí)的初始值,并重新讀取備份的函數(shù)參數(shù).

      通過修改庫函數(shù)將原先核函數(shù)的每次執(zhí)行變?yōu)槎啻螆?zhí)行后,如不恢復(fù)變量值為進(jìn)入核函數(shù)時(shí)的初始值,則可能導(dǎo)致程序的錯(cuò)誤,因?yàn)楹撕瘮?shù)執(zhí)行過程中可能修改部分全局內(nèi)存變量的值,此時(shí)原先只執(zhí)行一次的核函數(shù)被修改為多次執(zhí)行后會(huì)導(dǎo)致部分全局內(nèi)存變量被累計(jì)修改多次,從而導(dǎo)致錯(cuò)誤.為了避免這樣的錯(cuò)誤,需要提前備份可能被修改的變量的值,并在每次重復(fù)調(diào)用cudaLaunch前將上次執(zhí)行時(shí)被改變的變量恢復(fù)為正確的初始值,從而使核函數(shù)的多次執(zhí)行是在同樣的初始條件之下進(jìn)行,在最后一次重復(fù)調(diào)用cudaLaunch之后更新變量備份值.需要備份的變量為作用域大于核函數(shù)作用域且在核函數(shù)中可以被改變的變量,滿足此條件的變量只有全局存儲(chǔ)器變量,為了保證所有可能被改變的全局存儲(chǔ)器變量都被備份,我們備份了程序中所有的全局存儲(chǔ)器變量,并通過對(duì)相應(yīng)庫函數(shù)進(jìn)行插樁而實(shí)現(xiàn)了備份值跟隨原變量值的同步更新.為了實(shí)現(xiàn)變量的備份與同步更新,性能工具實(shí)現(xiàn)時(shí)維護(hù)了一個(gè)鏈表,鏈表中每個(gè)節(jié)點(diǎn)對(duì)應(yīng)于一個(gè)全局內(nèi)存變量,節(jié)點(diǎn)保存了被備份變量的內(nèi)存地址及備份值.我們重新實(shí)現(xiàn)了cudaMalloc等庫函數(shù),每當(dāng)通過這些函數(shù)新創(chuàng)建一個(gè)全局內(nèi)存變量時(shí)在鏈表中增加1個(gè)節(jié)點(diǎn),從而保證備份所有的全局內(nèi)存變量,同時(shí),我們重新實(shí)現(xiàn)了cudaMemcpy等函數(shù),每當(dāng)通過這些函數(shù)改變內(nèi)存變量值時(shí),根據(jù)內(nèi)存變量地址找到對(duì)應(yīng)的備份節(jié)點(diǎn),同步更新節(jié)點(diǎn)的備份值,從而實(shí)現(xiàn)備份值的同步更新.在每次重復(fù)調(diào)用cudaLaunch前恢復(fù)全部全局內(nèi)存變量值的方法為:遍歷備份鏈表,將各節(jié)點(diǎn)指向的內(nèi)存地址的內(nèi)存值恢復(fù)為節(jié)點(diǎn)存儲(chǔ)的備份值;最后一次重復(fù)調(diào)用cudaLaunch后,則以類似方法將鏈表中各個(gè)節(jié)點(diǎn)的備份值更新為對(duì)應(yīng)變量的當(dāng)前值.

      最后,我們對(duì)該工具的有效性與正確性進(jìn)行了驗(yàn)證.該工具收集的部分指標(biāo)與Visual Profiler一致,對(duì)于該部分指標(biāo),我們將該工具與Visual Profiler的輸出結(jié)果進(jìn)行了對(duì)比,結(jié)果顯示兩者沒有明顯差異;對(duì)于在Visual Profiler中沒有的指標(biāo),其中間結(jié)果都可以由Visual Profiler進(jìn)行收集,我們驗(yàn)證了這些指標(biāo)的中間結(jié)果的正確性,最后通過對(duì)CUDA官方示例中部分程序的源碼及運(yùn)行結(jié)果進(jìn)行分析而驗(yàn)證了這些指標(biāo)的有效性與正確性.

      4CUDA程序負(fù)載特征分析

      本文對(duì)著名的CUDA評(píng)測程序Rodinia中17個(gè)程序和全球正壓大氣淺水波方程求解應(yīng)用程序采用上述性能指標(biāo)進(jìn)行分析.本文的實(shí)驗(yàn)平臺(tái)為Dell Precision T5600服務(wù)器,CPU型號(hào)為Intel Xeon E5-2620,內(nèi)存大小為64 GB,操作系統(tǒng)為Red Hat Enterprise Linux 6.4 Server,GPU型號(hào)為NVIDIA Tesla K20c,該GPU的CUDA計(jì)算核心數(shù)量為2 496個(gè),共享內(nèi)存大小為4 800 MB.實(shí)驗(yàn)中使用的CUDA版本為CUDA 6.0.

      Rodinia中程序能夠較為廣泛地覆蓋并行程序的特性,其CUDA版本覆蓋了CUDA程序的多方面特性,因此其成為了對(duì)CUDA程序進(jìn)行測試分析的重要程序集.本文分析的Rodinia中17個(gè)程序如表1所示:

      Table 1 Programs in Rodinia

      4.1Rodinia負(fù)載分析

      1) 計(jì)算訪存分析結(jié)果

      Rodinia中17個(gè)程序的浮點(diǎn)計(jì)算與全局內(nèi)存訪問比如圖2所示,可以看出,37個(gè)核函數(shù)中有9個(gè)函數(shù)該指標(biāo)值大于1,其中有4個(gè)函數(shù)該指標(biāo)值大于2,有2個(gè)函數(shù)該指標(biāo)值大于3,分別是LV程序的核函數(shù)(7.97)和KM的函數(shù)kmeansPoint(86.25).部分程序的浮點(diǎn)計(jì)算訪存比為0,該類程序中沒有浮點(diǎn)計(jì)算.

      Fig. 2 The Rf-gvalues of the 17 programs in Rodinia.圖2 Rodinia中17個(gè)程序浮點(diǎn)計(jì)算與全局內(nèi)存訪問比

      本文中分析的應(yīng)用程序?yàn)榍蠼馊蛘龎捍髿鉁\水波方程的程序,該方程為大氣模擬過程中最基礎(chǔ)、最重要的方程.該程序支持多種混合架構(gòu),我們選取其單GPU版本進(jìn)行了性能分析.

      17個(gè)程序的浮點(diǎn)計(jì)算單元利用率如圖3所示,可以看出,這17個(gè)程序的浮點(diǎn)計(jì)算單元利用率普遍很低,37個(gè)核函數(shù)中有36個(gè)的該指標(biāo)值小于0.04,且其中28個(gè)核函數(shù)該值小于0.01;LV程序的核函數(shù)該指標(biāo)值最高,但也只達(dá)到0.177.這說明17個(gè)程序?qū)Ω↑c(diǎn)計(jì)算單元的利用率普遍較低.

      Fig. 3 The Ufvalues of the 17 programs in Rodinia.圖3 Rodinia中17個(gè)程序的浮點(diǎn)計(jì)算單元利用率

      17個(gè)程序的帶寬利用率Udram指標(biāo)值如圖4所示,可以看到,在37個(gè)核函數(shù)中有28個(gè)核函數(shù)的帶寬利用率小于0.5;CFD的函數(shù)cuda_time_step的該值最高,為0.7267.程序帶寬利用率整體不夠高的原因可能有2個(gè):①程序本身的特性,部分程序由于算法本身的特性及程序規(guī)模等原因,使得其即使訪存方式達(dá)到最優(yōu)也無法太多地利用帶寬;②程序本身訪存方式設(shè)計(jì)不夠合理,導(dǎo)致帶寬利用率較低.另外,與浮點(diǎn)計(jì)算單元利用率相比,程序的帶寬利用率整體高于前者.

      Fig. 4 The Udramvalues of the 17 programs in Rodinia.圖4 Rodinia中17個(gè)程序的帶寬利用率指標(biāo)值

      Fig. 5 The achieved_occupancy values of the 17 programs in Rodinia.圖5 Rodinia中17個(gè)程序各核函數(shù)的實(shí)際occupancy值

      從以上分析可知,Rodinia中程序的浮點(diǎn)計(jì)算單元利用率普遍較低,程序帶寬利用率普遍優(yōu)于浮點(diǎn)計(jì)算單元利用率.同時(shí),多數(shù)程序的浮點(diǎn)計(jì)算與全局內(nèi)存訪問比較低,說明程序的全局內(nèi)存訪問量相對(duì)浮點(diǎn)運(yùn)算而言更多,這與帶寬利用率相對(duì)略高而浮點(diǎn)計(jì)算單元利用率低的趨勢是一致的.由此可見,程序的帶寬利用率與浮點(diǎn)計(jì)算單元利用率一定程度上受程序本身計(jì)算訪存數(shù)量特征的影響.

      2) occupancy分析結(jié)果

      Rodinia中17個(gè)程序的occupancy如圖5所示,在37個(gè)核函數(shù)中有22個(gè)達(dá)到了0.7,其他15個(gè)核函數(shù)的occupancy值較小,其中GS程序的函數(shù)Fan2、LUD程序的函數(shù)lud_perimeter與lud_diagonal、MC程序的核函數(shù)kernel值最低,都為0.2,其理論occupancy值也較低,為0.25.

      對(duì)于GS程序的函數(shù)Fan2,在輸入為1 024×1 024的矩陣的情況下,程序網(wǎng)格的維數(shù)為(256,256,1),線程塊維數(shù)為(4,4,1),由此可見,線程塊維數(shù)較小最可能是導(dǎo)致occupancy值較低的原因.修改代碼,將線程塊維數(shù)設(shè)置為(16,16,1),測試結(jié)果顯示實(shí)際occupancy值提升為0.86.

      修改程序前后測試信息如表2所示,可以看出增大線程塊維數(shù)進(jìn)而增大occupancy值能夠有效地減少核函數(shù)執(zhí)行時(shí)間(減小了0.56).同時(shí),在采用此方法增大occupancy之后,程序的全局存儲(chǔ)器訪問效率有所降低(gld_efficiency與gst_efficiency值減小),這說明在增大occupancy之后,程序中同時(shí)運(yùn)行的warp更多,程序并行性更高,高并行性使得訪存時(shí)延被大量的計(jì)算指令的執(zhí)行有效地掩蓋了.

      Table 2 Optimization Result of Fan2 Function in GS Program

      Fig. 6 The shared_efficiency values of the 17 programs in Rodinia (0 means no use of shared memory).圖6 Rodinia中17個(gè)程序各核函數(shù)的shared_efficiency值(值為0表示沒有使用共享內(nèi)存)

      3) shared_efficiency分析結(jié)果

      Rodinia中17個(gè)程序的shared_efficiency值如圖6所示,在37個(gè)核函數(shù)中有14個(gè)使用了共享存儲(chǔ)器,在這14個(gè)函數(shù)中有8個(gè)程序的shared_efficiency指標(biāo)值達(dá)到了1.0,2個(gè)程序的shared_efficiency指標(biāo)值達(dá)到了0.8,其他4個(gè)函數(shù)的shared_efficiency指標(biāo)值較小,其中LV程序的函數(shù)kernel_gpu_cuda有最低的利用率,為0.4211.

      圖7顯示了LV程序的函數(shù)kernel_gpu_cuda在使用共享內(nèi)存時(shí)存在bank沖突.該函數(shù)中定義了2個(gè)共享內(nèi)存數(shù)組rA_shared和rB_shared,數(shù)組元素都是結(jié)構(gòu)體,大小為32 B.在計(jì)算能力為3.5的GPU中,共享存儲(chǔ)器被分為32個(gè)bank,該程序運(yùn)行時(shí)bank的存儲(chǔ)單元大小為4 B,則每訪問連續(xù)的32個(gè)4 B后會(huì)回到原先訪問的bank中.由此可知,該程序中同一個(gè)warp中對(duì)2個(gè)共享內(nèi)存數(shù)組的第n個(gè)元素的訪問與第n+4個(gè)元素的訪問會(huì)產(chǎn)生bank沖突.對(duì)于數(shù)組rA_shared,warp中不同的線程之間會(huì)產(chǎn)生大量的bank沖突;對(duì)于數(shù)組rB_shared,由在循環(huán)中訪問的過程中,half-warp的不同線程可能訪問到相同的bank中,從而造成bank conflict沖突.

      4) 全局存儲(chǔ)器訪問效率分析結(jié)果

      Rodinia中17個(gè)程序的gld_efficiency與gst_efficiency值如圖8所示.對(duì)于gld_efficiency,MM程序的函數(shù)mummergpuKernel有最低值0.032,PT程序的函數(shù)find_index_kernel有最高值7.3438;對(duì)于gst_efficiency,MM程序的函數(shù)printKernel有最低值0.0938,CFD的函數(shù)cuda_time_step及其他程序的部分函數(shù)有最高值1.0.

      Fig. 7 The bank conflict for function kernel_gpu_cuda in program LV accessing rA_shared.圖7 LV程序函數(shù)kernel_gpu_cuda訪問變量rA_shared時(shí)的bank沖突

      Fig. 8 The gld_efficiency and gst_efficiency values of the 17 programs in Rodinia.圖8 Rodinia中17個(gè)程序各核函數(shù)的全局存儲(chǔ)器訪問效率

      如圖9所示,MM程序的函數(shù)mummergpu-Kernel中對(duì)全局內(nèi)存的訪問存在非合并訪問的現(xiàn)象.在同一個(gè)線程中,對(duì)全局內(nèi)存數(shù)組多次以比較隨機(jī)的索引值進(jìn)行訪問,warp中的不同線程對(duì)該數(shù)組的訪問的位置也很難連續(xù),因此無法合并訪問.最終該函數(shù)的gld_efficiency=0.032.

      對(duì)于PT程序的函數(shù)find_index_kernel,其對(duì)全局內(nèi)存塊arrayX和arrayY的訪問一般是連續(xù)多次訪問同一個(gè)地址,這種情況下warp在執(zhí)行訪存指令時(shí)可以只進(jìn)行一次訪存,訪存效率較高,gld_efficiency=7.3438.

      圖10為MM程序的函數(shù)printKernel中部分代碼結(jié)構(gòu),該函數(shù)中存在大量對(duì)結(jié)構(gòu)體類型的全局內(nèi)存數(shù)組元素的成員的訪問,訪問的地址難以滿足合并訪問所要求的對(duì)齊規(guī)則,且warp中各個(gè)線程訪問的地址可能不連續(xù),使得出現(xiàn)大量非連續(xù)訪問,gst_efficiency值較低,gst_efficiency=0.0938.

      在CFD的cuda_time_step等函數(shù)及其他程序的部分函數(shù)中,對(duì)同一warp中對(duì)全局內(nèi)存的訪問是連續(xù)的并且是對(duì)齊的,因此訪問效率很高,gst_efficiency=1.0.

      5) warp執(zhí)行效率分析結(jié)果

      Rodinia中17個(gè)程序的warp執(zhí)行效率值如圖11所示,圖11中包括2項(xiàng)指標(biāo):warp_execution_efficiency與warp_nonpred_execution_efficiency.可以看到,在37個(gè)核函數(shù)中,大部分函數(shù)的warp執(zhí)行效率指標(biāo)值達(dá)到或接近0.8,只有少數(shù)函數(shù)的指標(biāo)值較低,同時(shí)可以看到大部分核函數(shù)中,warp_execution_efficiency值都會(huì)略大于warp_nonpred_execution_efficiency值,說明在大部分核函數(shù)中都存在分支指令的謂詞替換.

      MC程序中函數(shù)kernel的warp執(zhí)行效率值最低,warp_execution_efficiency=0.0344,warp_non-pred_execution_efficienc=0.0328.如圖12所示,MC程序的kernel運(yùn)行時(shí)只使用了2個(gè)warp,而每個(gè)warp中只有一個(gè)線程在執(zhí)行串行程序,其他31個(gè)線程空閑,從而使線程分歧比較嚴(yán)重,線程利用率非常低.

      Fig. 9 The analysis of the performance bottleneck of function mummergpuKernel in program MM.圖9 MM程序的函數(shù)mummergpuKernel性能瓶頸分析

      Fig. 10 The analysis of the performance bottleneck of function printKernel in program MM.圖10 MM程序的函數(shù)printKernel性能瓶頸分析

      Fig. 11 The warp execution efficiency of the 17 programs in Rodinia.圖11 Rodinia中17個(gè)程序各核函數(shù)的warp執(zhí)行效率

      Fig. 12 The analysis of the performance bottleneck of function kernel in program MC.圖12 MC程序的函數(shù)kernel性能瓶頸分析

      LUD程序的函數(shù)lud_internal不存在分支指令,warp中所有線程執(zhí)行路徑一致,因此不存在線程分歧,warp執(zhí)行效率最高,warp_execution_efficiency和warp_nonpred_execution_efficiency值都為1.0.

      4.2應(yīng)用程序分析

      求解全球正壓大氣淺水波方程的程序分為使用共享內(nèi)存的版本和不使用共享內(nèi)存的版本,我們對(duì)使用共享內(nèi)存的版本做了分析,分析結(jié)果如表3所示:

      Table 3 The Analysis Result of The Cubed-sphere Shallow-water Model Program

      該程序浮點(diǎn)計(jì)算與全局內(nèi)存訪問比較高,分析代碼可知,程序計(jì)算指令比較多且大多數(shù)訪存是針對(duì)的共享存儲(chǔ)器,從而有比較高的浮點(diǎn)計(jì)算與全局內(nèi)存訪問比值.程序的實(shí)測浮點(diǎn)性能與浮點(diǎn)計(jì)算單元利用率比較低,而帶寬利用率較高,因此,優(yōu)化時(shí)需要重點(diǎn)針對(duì)計(jì)算指令進(jìn)行.

      程序的GPU占用率指標(biāo)值較低,分析代碼可知,程序中使用了大量的共享內(nèi)存(每個(gè)線程使用40.5 KB共享內(nèi)存),且大量的局部變量占用了大量的寄存器(每個(gè)線程使用63個(gè)寄存器),從而使程序無法同時(shí)執(zhí)行太多的線程,導(dǎo)致并行度不夠高.優(yōu)化時(shí),可以將局部變量和共享內(nèi)存中的常量存儲(chǔ)于常數(shù)存儲(chǔ)器中或使用宏定義來代替,以減少對(duì)共享內(nèi)存和寄存器的使用.

      程序的共享內(nèi)存訪問效率比較低,存在bank沖突.優(yōu)化時(shí)需要改變共享內(nèi)存數(shù)組的組織與訪問形式,消除bank沖突.程序的全局內(nèi)存訪問效率很高,說明很好地利用了合并訪問的機(jī)制;程序線程束執(zhí)行效率很高,不存在大量的影響性能的條件分支.

      總體來說,程序應(yīng)該從計(jì)算指令吞吐率、GPU占用率、共享內(nèi)存數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)和訪問方式3個(gè)方面來進(jìn)行優(yōu)化.

      5CUDA程序性能建議

      根據(jù)對(duì)Rodinia和淺水波應(yīng)用程序的負(fù)載分析,本文總結(jié)出CUDA程序的性能建議:

      1) GPU占用率(occupancy)是反映程序性能的重要指標(biāo),能夠反映出程序?qū)PU并行計(jì)算單元的利用情況,該值較低表示程序?qū)PU并行計(jì)算單元的利用率較低.影響程序occupancy的指標(biāo)包括線程塊中線程數(shù)量、線程占用的寄存器數(shù)量和線程塊分配的共享存儲(chǔ)大小,其中,線程數(shù)量反映開發(fā)者分配的最大并行線程量,寄存器數(shù)量和共享存儲(chǔ)大小反映單位線程占用的存儲(chǔ)器資源大小.在開發(fā)CUDA程序時(shí),一方面要盡量減少核函數(shù)中局部變量的數(shù)量,以減少對(duì)寄存器的占用,同時(shí)控制共享內(nèi)存的占用,通過減少單位線程占用的資源量來增大可以同時(shí)發(fā)起的線程數(shù)量;另一方面,在寄存器和共享內(nèi)存占用量足夠的情況下,按照程序輸入規(guī)模盡量多地開啟并行執(zhí)行的線程.

      2) 共享存儲(chǔ)器訪問效率(shared_efficiency)反映的是程序中共享內(nèi)存的使用效率,能夠反映程序的bank沖突,該值低于1.0時(shí)表示存在bank沖突.不同的GPU架構(gòu)之下,共享內(nèi)存會(huì)被分為16或32個(gè)bank,bank的存儲(chǔ)單位大小為4 B或8 B.使用共享存儲(chǔ)器時(shí),需要根據(jù)變量所占存儲(chǔ)空間大小進(jìn)行控制,盡量使half-warp中的不同線程不訪問同一個(gè)bank(除非是訪問同一個(gè)變量).計(jì)算能力不小于2.x的GPU的bank數(shù)量為32,這是目前主流的GPU結(jié)構(gòu).對(duì)于這其中bank大小為4 B的GPU,共享內(nèi)存數(shù)組元素存儲(chǔ)大小不大于8 B時(shí),在每個(gè)線程只訪問一個(gè)元素的情況下各線程連續(xù)訪問時(shí)恰好不會(huì)發(fā)生bank沖突;大于8 B時(shí)可能發(fā)生bank沖突,典型地,當(dāng)數(shù)組元素為8 B的2倍及以上的整數(shù)倍時(shí)會(huì)發(fā)生bank沖突,由此可知數(shù)組元素為基本變量類型時(shí)一般不會(huì)發(fā)生bank沖突,數(shù)組元素為存儲(chǔ)大小較大的結(jié)構(gòu)體時(shí)容易發(fā)生bank沖突,bank大小為8 B的GPU在以上情況下發(fā)生bank沖突的數(shù)組元素存儲(chǔ)大小為以上對(duì)應(yīng)大小的倍數(shù).開發(fā)者使用共享內(nèi)存時(shí)需要注意以上規(guī)律.

      3) 全局存儲(chǔ)器訪問效率(gld_efficiency和gst_efficiency)反映程序中全局內(nèi)存的訪問效率,對(duì)應(yīng)值較小時(shí)表示全局內(nèi)存訪問模式或訪問時(shí)對(duì)齊方式?jīng)]有達(dá)到最優(yōu).全局內(nèi)存的合并訪問機(jī)制大大提高了其訪問效率,合并訪問對(duì)于訪問方式有一定的要求,不同的GPU架構(gòu)之下其要求不盡相同,但都是針對(duì)訪問地址的連續(xù)和對(duì)齊2方面.全局內(nèi)存訪問的典型不合理模式包括:依次連續(xù)訪問元素類型為結(jié)構(gòu)體的數(shù)組中結(jié)構(gòu)體元素的同一個(gè)成員,進(jìn)而導(dǎo)致訪問地址不連續(xù);條件控制語句中根據(jù)變化的條件訪問全局內(nèi)存,導(dǎo)致訪問地址的離散化.全局內(nèi)存訪問相對(duì)較慢,可以使用其他類型存儲(chǔ)器來代替全局存儲(chǔ)器以加速數(shù)據(jù)訪問速度,對(duì)于常量可以使用常數(shù)存儲(chǔ)器存儲(chǔ),對(duì)于需要多次訪問的大量數(shù)據(jù)則可以存儲(chǔ)于共享內(nèi)存中;對(duì)于由于數(shù)據(jù)量過大等原因而無法存儲(chǔ)于其他存儲(chǔ)器的全局內(nèi)存變量,對(duì)其訪問時(shí)盡量使訪問地址連續(xù),盡量不要使用結(jié)構(gòu)體數(shù)組的數(shù)據(jù)結(jié)構(gòu)形式,該數(shù)據(jù)結(jié)構(gòu)形式下很容易使內(nèi)存訪問地址離散化,也要盡量避免在條件控制語句中出現(xiàn)的離散訪問;同時(shí),對(duì)于不同的GPU架構(gòu),需要注意對(duì)全局內(nèi)存數(shù)據(jù)訪問的對(duì)齊方式,以充分利用合并訪問特性進(jìn)行訪存加速.

      4) 線程束執(zhí)行效率(warp_execution_efficiency與warp_nonpred_execution_efficiency)反映了程序的線程分歧情況,前者沒有考慮分支預(yù)測,后者反映分支預(yù)測的情況,綜合2個(gè)指標(biāo)可以全面了解線程分歧情況.線程分歧會(huì)導(dǎo)致大量線程等待或執(zhí)行無效指令,對(duì)程序性能影響很大,程序開發(fā)者應(yīng)盡量減少控制語句的使用,使用一些方法將控制語句轉(zhuǎn)化為非控制語句;對(duì)于無法避免的控制語句,盡量使其分支以half-warp來劃分,使得同一個(gè)half-warp中執(zhí)行同一個(gè)分支,從而避免線程分歧.

      6結(jié)論

      本文中,我們分析總結(jié)了CUDA程序的重要性能指標(biāo),基于CUPTI接口開發(fā)了能夠獲取這些性能指標(biāo)的性能分析工具,使用該工具對(duì)Rodinia中的程序進(jìn)行了負(fù)載分析,并對(duì)主要性能指標(biāo)顯示的部分程序的性能瓶頸在源代碼中進(jìn)行了原因分析,之后對(duì)全球正壓大氣淺水波模式應(yīng)用程序進(jìn)行了性能分析,討論了其性能特性.對(duì)Rodinia的負(fù)載分析結(jié)果較全面地反映了常用CUDA程序在各方面的負(fù)載特征,該結(jié)果可以為未來CUDA程序優(yōu)化分析及GPU系統(tǒng)結(jié)構(gòu)優(yōu)化分析提供數(shù)據(jù)資料.通過對(duì)重要性能指標(biāo)反映有性能瓶頸的部分程序進(jìn)行分析,我們?yōu)殚_發(fā)者展示了常見性能瓶頸的典型原因,并提出了一些開發(fā)高效程序的建議.

      參考文獻(xiàn)

      [1]Zhang E Z, Jiang Y, Guo Z, et al. On-the-fly elimination of dynamic irregularities for GPU computing[J]. ACM SIGPLAN Notices, 2011, 46(1): 369-380

      [2]Yang Y, Zhou H. CUDA-NP: Realizing nested thread-level parallelism in GPGPU applications[J]. Journal of Computer Science and Technology, 2015, 30(1): 93-106

      [3]Margiolas C, O’Boyle M F P. Portable and transparent host-device communication optimization for GPGPU environments[C] //Proc of Annual IEEE/ACM Int Symp on Code Generation and Optimization. New York: ACM, 2014: 55-65

      [4]Xiang P, Yang Y, Zhou H. Warp-level divergence in GPUs: Characterization, impact, and mitigation[C] //Proc of the 20th Int Symp on High Performance Computer Architecture (HPCA). Los Alamitos, CA: IEEE Computer Society, 2014: 284-295[5]Che S, Boyer M, Meng J, et al. Rodinia: A benchmark suite for heterogeneous computing[C] //Proc of IEEE Int Symp on Workload Characterization. Piscataway, NJ: IEEE, 2009: 44-54

      [6]Yang C, Xue W, Fu H, et al. A peta-scalable CPU-GPU algorithm for global atmospheric simulations[J]. ACM SIGPLAN Notices, 2013, 48(8): 1-11

      [7]Browne S, Dongarra J, Garner N, et al. A portable programming interface for performance evaluation on modern processors[J]. International Journal of High Performance Computing Applications, 2000, 14(3): 189-204

      [8]Shende S S, Malony A D. The TAU parallel performance system[J]. International Journal of High Performance Computing Applications, 2006, 20(2): 287-311

      [9]NVIDIA Corporation. NVIDIA visual profiler[CP/OL]. 2014 [2014-07-15]. https://developer.nvidia.com/nvidia-visual-profiler

      [10]Yang Y, Xiang P, Mantor M, et al. Fixing performance bugs: An empirical study of open-source GPGPU programs[C] //Proc of the 41st Int Conf on Parallel Processing (ICPP). Piscataway, NJ: IEEE, 2012: 329-339

      [11]Stratton J A, Anssari N, Rodrigues C, et al. Optimization and architecture effects on GPU computing workload performance[C] //Proc of Innovative Parallel Computing. Piscataway, NJ: IEEE, 2012: 1-10

      [12]Yang Y, Xiang P, Kong J, et al. A unified optimizing compiler framework for different GPGPU architectures[J]. ACM Trans on Architecture and Code Optimization, 2012, 9(2): 970-983

      [13]Li C, Yang Y, Lin Z, et al. Automatic data placement into GPU on-chip memory resources[C] //Proc of IEEE/ACM Int Symp on Code Generation and Optimization (CGO). Piscataway, NJ: IEEE, 2015: 23-33

      [14]Chen G, Wu B, Li D, et al. PORPLE: An extensible optimizer for portable data placement on GPU[C] //Proc of the 47th Annual IEEE/ACM Int Symp on Microarchitecture (MICRO). Piscataway, NJ: IEEE, 2014: 88-100

      [15]Wahib M, Maruyama N. Scalable kernel fusion for memory-bound GPU applications[C] //Proc of the Int Conf for High Performance Computing, Networking, Storage and Analysis. Piscataway, NJ: IEEE, 2014: 191-202

      [16]Li Jianjiang, Li Xinggang, Lu Chuan, et al. A template technology for transplanting from single-GPU programs to multi-GPU programs[J]. Journal of Computer Research and Development, 2010, 47(12): 2185-2191 (in Chinese)(李建江, 李興鋼, 路川, 等. 一種單 GPU 程序向多GPU移植的模板化技術(shù)[J]. 計(jì)算機(jī)研究與發(fā)展, 2010, 47(12): 2185-2191)

      [17]Williams S, Waterman A, Patterson D. Roofline: An insightful visual performance model for multicore architectures[J]. Communications of the ACM, 2009, 52(4): 65-76

      Zheng Zhen, born in 1991. PhD candidate. His main research interests include high performance computing.

      Zhai Jidong, born in 1981. PhD and assistant professor. His main research interests include high performance computing and performance evaluation.

      Li Yan, born in 1985. PhD. His main research interests include high performance computing and parallel computing.

      Chen Wenguang, born in 1972. PhD and professor. His main research interests include high performance computing and compiler optimization.

      Workload Analysis for Typical GPU Programs Using CUPTI Interface

      Zheng Zhen, Zhai Jidong, Li Yan, and Chen Wenguang

      (DepartmentofComputerScienceandTechnology,TsinghuaUniversity,Beijing100084)

      AbstractGPU-based high performance computers have become an important trend in the area of high performance computing. However, developing efficient parallel programs on current GPU devices is very complex because of the complex memory hierarchy and thread hierarchy. To address this problem, we summarize five kinds of key metrics that reflect the performance of programs according to the hardware and software architecture. Then we design and implement a performance analysis tool based on underlying CUPTI interfaces provided by NVIDIA, which can collect key metrics automatically without modifying the source code. The tool can analyze the performance behaviors of GPU programs effectively with very little impact on the execution of programs. Finally, we analyze 17 programs in Rodinia benchmark, which is a famous benchmark for GPU programs, and a real application using our tool. By analyzing the value of key metrics, we find the performance bottlenecks of each program and map the bottlenecks back to source code. These analysis results can be used to guide the optimization of CUDA programs and GPU architecture. Result shows that most bottlenecks come from inefficient memory access, and include unreasonable global memory and shared memory access pattern, and low concurrency for these programs. We summarize the common reasons for typical performance bottlenecks and give some high-level suggestions for developing efficient GPU programs.

      Key wordsgraphics processing unit (GPU); workload analysis; Rodinia; performance counter; performance metric

      收稿日期:2014-12-10;修回日期:2015-08-11

      基金項(xiàng)目:國家自然科學(xué)基金項(xiàng)目(61103021);國家“八六三”高技術(shù)研究發(fā)展計(jì)劃基金項(xiàng)目(2012AA010901)

      中圖法分類號(hào)TP338.4

      This work was supported by the National Natural Science Foundation of China (61103021) and the National High Technology Research and Development Program of China (863 Program) (2012AA010901).

      猜你喜歡
      性能指標(biāo)
      渤海P油田統(tǒng)注水井分流酸性能指標(biāo)及效果評(píng)價(jià)研究
      云南化工(2021年5期)2021-12-21 07:41:22
      瀝青膠結(jié)料基本高溫性能指標(biāo)相關(guān)性研究
      石油瀝青(2021年1期)2021-04-13 01:31:08
      北斗衛(wèi)星空間信號(hào)故障與監(jiān)測性能指標(biāo)定義
      家居空氣凈化器的評(píng)價(jià)方法
      綠色科技(2017年10期)2017-07-05 10:41:37
      某電站汽輪機(jī)性能試驗(yàn)熱力計(jì)算研究
      科學(xué)家(2017年3期)2017-05-22 09:56:40
      基于超聲波技術(shù)的四旋翼無人機(jī)定高控制系統(tǒng)的研究
      計(jì)算機(jī)主板與CPU的性能指標(biāo)分析
      帶有延遲的無限服務(wù)臺(tái)(DIS)的逼近
      儲(chǔ)熱水箱分層性能指標(biāo)的研究進(jìn)展
      WebGIS關(guān)鍵性能指標(biāo)測試技術(shù)研究
      禹州市| 瓦房店市| 瑞金市| 牙克石市| 嘉禾县| 莱州市| 兰州市| 芦山县| 邛崃市| 房山区| 乌鲁木齐市| 营山县| 长兴县| 南阳市| 锡林浩特市| 桐城市| 衡山县| 扶绥县| 宜都市| 江陵县| 赫章县| 阳原县| 久治县| 佛山市| 漳州市| 肇州县| 琼结县| 黄陵县| 沈阳市| 楚雄市| 宽城| 丰台区| 靖江市| 荥经县| 淄博市| 沁源县| 淅川县| 黔南| 长顺县| 贵州省| 株洲市|