曹建立, 賴宏慧, 芮璋現(xiàn)
(1.洛陽師范學(xué)院數(shù)學(xué)科學(xué)學(xué)院,河南洛陽 471934;2. 贛南醫(yī)學(xué)院信息工程學(xué)院,江西贛州 341000;3. 銅陵瑞嘉特種材料有限公司,安徽銅陵 244000)
GPGPU-Sim的原理與調(diào)試
曹建立1, 賴宏慧2, 芮璋現(xiàn)3
(1.洛陽師范學(xué)院數(shù)學(xué)科學(xué)學(xué)院,河南洛陽 471934;2. 贛南醫(yī)學(xué)院信息工程學(xué)院,江西贛州 341000;3. 銅陵瑞嘉特種材料有限公司,安徽銅陵 244000)
本文對GPGPU-Sim模擬器的原理、 實(shí)現(xiàn)細(xì)節(jié)和運(yùn)行過程進(jìn)行了分析, 并介紹了使用GDB對其運(yùn)行過程進(jìn)行動(dòng)態(tài)追蹤的方法.
GPU通用計(jì)算; 模擬器; 動(dòng)態(tài)鏈接庫; 調(diào)試
GPGPU體系結(jié)構(gòu)模擬器有著低成本、 高靈活性和高度可配置性的優(yōu)點(diǎn), 因此在體系結(jié)構(gòu)研究中得到了廣泛的應(yīng)用. 體系結(jié)構(gòu)研究者的新設(shè)計(jì)、 新算法可以在模擬器中通過修改配置文件、 源代碼得到快速實(shí)現(xiàn), 并可通過運(yùn)行不同類型的benchmark來收集運(yùn)行結(jié)果, 從而可完成對其性能、 功耗評測, 進(jìn)而可對目標(biāo)處理器的結(jié)構(gòu)進(jìn)行改進(jìn)和優(yōu)化. 國際上有大量的學(xué)術(shù)論文、 專利等研究成果都基于開源模擬器平臺, 如GEM5和SimpleScalar. 各大處理器生產(chǎn)公司的研發(fā)部門也有自己的模擬器平臺, 如IBM的BGLsim模擬器, AMD和HP共同開發(fā)的COTSon模擬器.
近年來, 隨著GPU(Graphics Processing Unit, 圖形處理器)浮點(diǎn)運(yùn)算能力的迅速提升,GPU通用計(jì)算(General-Purpose computation on GPU)在模擬核聚變、 氣象預(yù)測、 基因工程、 遙感數(shù)據(jù)處理、 電子商務(wù)、 數(shù)據(jù)挖掘、 大數(shù)據(jù)等非圖形應(yīng)用領(lǐng)域得到了廣泛應(yīng)用, 使得GPU的優(yōu)化成為體系結(jié)構(gòu)領(lǐng)域的一個(gè)研究熱點(diǎn).
GPGPU-Sim[1]是University of British Columbia的Tor Aamodt等人開發(fā)的GPU體系結(jié)構(gòu)模擬器, 用于模擬NVIDIA的Fermi和GT200架構(gòu)的GPU. 其官方網(wǎng)站網(wǎng)址為http://www.gpgpu-sim.org.
本文分析了CUDA程序的編譯過程,介紹了GPGPU-Sim模擬器的運(yùn)行原理和常用的基準(zhǔn)測試套件,最后研究了GPGPU-Sim的動(dòng)態(tài)調(diào)試方法.
CUDA(Compute Unified Device Architecture), 是NVIDIA公司推出的運(yùn)行在其公司硬件上的運(yùn)算平臺. 該平臺大大簡化了GPU并行程序的開發(fā)過程. CUDA提供的運(yùn)行時(shí)API, 封裝在libcudart.so/libcudart.a中. 更底層的驅(qū)動(dòng)API則封裝在libcuda.so中(在Windows操作系統(tǒng)中, 運(yùn)行時(shí)API封裝在cudart.dll/cudart.lib中, 驅(qū)動(dòng)API封裝在nvcuda.dll中). CUDA程序的調(diào)用過程如圖1所示.
圖1 CUDA的調(diào)用過程
CUDA提供的nvcc是一個(gè)編譯驅(qū)動(dòng), 在不同的階段分別調(diào)用CUDA安裝目錄下bin子目錄中的nvopencc、 ptxas、 fatbin、 cudafe工具, 將CUDA源代碼中的CPU代碼和GPU代碼分離, 并將GPU代碼編譯成PTX中間代碼和多個(gè)不同版本的硬件二進(jìn)制SASS代碼. 源代碼中的CPU代碼部分用GCC編譯器(Windows下可用微軟的CL編譯器)編譯為二進(jìn)制代碼. 最終, nvcc將CPU的二進(jìn)制代碼、 PTX中間代碼和SASS二進(jìn)制代碼合并成為可執(zhí)行文件.
在CUDA并行程序執(zhí)行時(shí), 程序中的CPU代碼在CPU上執(zhí)行. 需要GPU運(yùn)行的代碼和待處理數(shù)據(jù)則會通過PCI-E總線發(fā)送到GPU端, GPU會選擇適合當(dāng)前硬件架構(gòu)的SASS二進(jìn)制版本來執(zhí)行. 如果程序中包含的全部二進(jìn)制SASS版本和當(dāng)前硬件都不匹配, 則GPU會啟動(dòng)JIT(Just In Time Complilation, 即時(shí)編譯), 先將程序中包含的PTX中間代碼即時(shí)編譯為適合當(dāng)前硬件架構(gòu)的二進(jìn)制SASS代碼, 然后再執(zhí)行. 因此, 有些GPU程序在第一次執(zhí)行時(shí), 速度較慢, 第二次執(zhí)行時(shí), 因?yàn)橐呀?jīng)緩存了即時(shí)編譯后的二進(jìn)制代碼, 則執(zhí)行速度會提升. 在進(jìn)行性能測試時(shí), 一般要進(jìn)行多次, 取平均值, 并且將第一次執(zhí)行的性能結(jié)果忽略不計(jì).
GPGPU-Sim運(yùn)行在Linux系統(tǒng)下, 其實(shí)現(xiàn)代碼根據(jù)功能分布在幾個(gè)目錄中: cuda-sim目錄中的代碼功能為分析和模擬PTX指令; gpgpu-sim目錄中的代碼實(shí)現(xiàn)性能模擬和可視化數(shù)據(jù)收集; gpu-watch目錄中代碼實(shí)現(xiàn)了功耗模擬; intersim2目錄中的代碼實(shí)現(xiàn)了處理器核心和顯存之間的互聯(lián)網(wǎng)絡(luò). 整個(gè)模擬器用C++實(shí)現(xiàn), 并利用堆棧、 隊(duì)列、 數(shù)組、 哈希表、 圖等數(shù)據(jù)結(jié)構(gòu)創(chuàng)建了一個(gè)可以執(zhí)行PTX/SASS指令的GPU模型, 在此模型上實(shí)現(xiàn)了大部分的CUDA函數(shù)調(diào)用, 最終將這些模塊封裝為動(dòng)態(tài)鏈接庫libcudart.so、 libOpenCL.so.
使用GPGPU-Sim時(shí), 需要將系統(tǒng)動(dòng)態(tài)鏈接庫查找路徑變量LD_LIBRARY_PATH指向這兩個(gè)動(dòng)態(tài)鏈接庫所在的目錄, 替代CUDA ToolKit安裝后的lib目錄. 當(dāng)CUDA程序運(yùn)行時(shí), 原本應(yīng)該由GPU執(zhí)行的PTX/SASS指令和CUDA的調(diào)用則被GPGPU-Sim模擬器攔截, 在CPU上模擬執(zhí)行. 調(diào)用過程如圖2所示.
待執(zhí)行結(jié)束, 會輸出一份包含IPC、 緩存缺失率、 流處理器利用率、 顯存訪問次數(shù)等信息的報(bào)告, 通過分析該報(bào)告, 研究者可以分析出性能瓶頸并對GPU體系結(jié)構(gòu)作出針對性的改進(jìn). GPGPU-Sim僅在運(yùn)行時(shí)API層次上模擬了CUDA, 因此無法運(yùn)行包含了驅(qū)動(dòng)API的CUDA程序.
圖2 GPGPU-Sim的調(diào)用過程
模擬器模擬的硬件通過gpgpusim.config配置文件來描述, GPGPU-Sim提供了GTX480、 Tesla2050、 QuadroFX5580/5600/5800顯卡的配置文件. 用戶也可通過修改配置文件來修改目標(biāo)GPU的流處理器數(shù)量、 warp調(diào)度器數(shù)量、 調(diào)度策略和顯存容量等參數(shù). 例如, warp調(diào)度器可以設(shè)定為LRR循環(huán)算法、 GTO貪心算法、 Two level兩級調(diào)度算法; 緩存淘汰策略可以設(shè)置為FIFO先進(jìn)先出算法、 LRU最近最久未用算法、 Random隨機(jī)置換算法.
而更深入的研究, 例如創(chuàng)建新的warp/CTA調(diào)度算法、 新的顯存管理策略, 則需要研究者自己通過修改模擬器源代碼的方法來實(shí)現(xiàn).
研究者一般通過在模擬器上運(yùn)行基準(zhǔn)測試套件(Benchmark Suite)來衡量處理器的性能, 對比不同架構(gòu)方案的優(yōu)劣. 套件中包含了不同類型和特征的測試程序, 如計(jì)算密集型和訪存密集型, 能較為全面地代表不同類型的應(yīng)用程序. 在GPU體系結(jié)構(gòu)研究領(lǐng)域, 常用的基準(zhǔn)測試套件有GPGPU-Sim團(tuán)隊(duì)在ISPASS 2009 paper[2]中使用的測試套件, 弗吉尼亞大學(xué)計(jì)算機(jī)科學(xué)系開發(fā)的Rodinia[3], 新浪和微軟合作開發(fā)的Mars[4], 伊利諾伊大學(xué)香檳分??尚排c高性能計(jì)算中心開發(fā)的Parboil[5]等.
一個(gè)基準(zhǔn)測試套件一般包含十幾到幾十個(gè)測試程序, 可能還需要在不同配置下多次運(yùn)行, 會產(chǎn)生大量的輸出報(bào)告, 從輸出報(bào)告中人工查找所需的參數(shù)是個(gè)較為繁瑣的工作. 可以使用grep、 awk、 sed等工具和Shell腳本來完成數(shù)據(jù)的收集和制表工作, 然后導(dǎo)入到Matlab或者Excel中來進(jìn)行統(tǒng)計(jì)分析.
在GPU體系結(jié)構(gòu)的研究過程中, 需要分析和修改模擬器的源代碼. 靜態(tài)分析往往難以理解其運(yùn)行原理. 修改源代碼后執(zhí)行出現(xiàn)異常, 靜態(tài)分析也難以找到邏輯錯(cuò)誤. 這時(shí), 需要使用GDB工具對模擬器進(jìn)行動(dòng)態(tài)的調(diào)試除錯(cuò).
GPGPU-Sim提供了調(diào)試模式. 如果在模擬器運(yùn)行前, 將系統(tǒng)環(huán)境變量GPGPUSIM_DEBUG設(shè)為1, 則GPGPU-Sim啟動(dòng)后, 遇到CUDA的Kernel函數(shù)時(shí), 會進(jìn)入調(diào)試模式. 在該模式下, 可以單步執(zhí)行程序, 也可以顯示處理器流水線的狀態(tài). 但在實(shí)踐中, 這種調(diào)試方法不夠穩(wěn)定, 和成熟的調(diào)試器GDB相比, 也不夠靈活. 因此, 不建議使用該調(diào)試方法.
使用GDB, 既可以調(diào)試CUDA程序, 也可以調(diào)試模擬器本身, 方法是在適當(dāng)?shù)奈恢迷O(shè)置斷點(diǎn). 調(diào)試過程如下:
(1)編譯模擬器時(shí), 需要編譯為debug版本. 具體命令為:
source setup_environment debug
make
(2)編譯CUDA應(yīng)用程序時(shí), 也將其編譯為debug版本, 其代碼是:
nvcc -g myprog.cu -o myprog
(3)用GDB載入程序. 其代碼是:
gdb myprog
gdb會載入程序和調(diào)試程序所需的源代碼和符號表.
(4)如需調(diào)試CUDA程序, 則在CUDA程序中設(shè)定斷點(diǎn), 其代碼是:
break main
(5)如果需要調(diào)試模擬器, 則在模擬器代碼中設(shè)置行號斷點(diǎn), 其代碼是:
break shader.cc:180
或者函數(shù)斷點(diǎn):
break scheduler_unit::cycle()
(6)運(yùn)行程序, 其代碼是:
Run
運(yùn)行程序后, 模擬器的源代碼已經(jīng)被編譯為動(dòng)態(tài)鏈接庫, 當(dāng)CUDA程序發(fā)出CUDA函數(shù)調(diào)用時(shí), 動(dòng)態(tài)鏈接庫會被載入內(nèi)存執(zhí)行, 當(dāng)遇到斷點(diǎn)時(shí)會停下來, 此時(shí)可以觀察變量值和調(diào)用堆棧, 并單步運(yùn)行, 以分析程序運(yùn)行是否正常.
GPGPU-Sim模擬器的gpgpu_sim::cycle()函數(shù)會訪問一個(gè)全局標(biāo)志變量g_single_step,該變量值如果不為0, 則模擬器運(yùn)行的周期數(shù)超過該值后, 每個(gè)周期都會觸發(fā)一個(gè)單步中斷.
GPGPU-Sim還提供了GDB的腳本文件.gdbinit, 以幫助用戶在調(diào)試時(shí)查看模擬器的內(nèi)部狀態(tài). 該文件中定義了多個(gè)宏. 其中, 宏dp
上述調(diào)試方法針對的是GPGPU-Sim模擬器, 如果在GPU硬件上調(diào)試CUDA程序, 則可利用Nvidia提供的CUDA-GDB[6]和圖形界面調(diào)試工具Nsight[7], 這樣會更為便捷.
GPGPU-Sim是一款高精度、 易配置、 易使用的GPU模擬器. 使用該模擬器可以迅速驗(yàn)證NVIDIA GPU的設(shè)計(jì)原型和優(yōu)化方案, 其在科研工作者中得到了廣泛的使用. 本文分析了該模擬器的模擬機(jī)制以及用GDB進(jìn)行調(diào)試的過程.
該模擬器在Google Group上擁有開發(fā)者群對其進(jìn)行維護(hù)和更新, 其網(wǎng)址為http://groups.google.com/group/gpgpu-sim/, 最新版可以支持CUDA7.0的一些特性. 但其內(nèi)核模擬的是Fermi架構(gòu), 對于Kepler、 Pascal架構(gòu)的顯卡模擬精度較低, 這也是該模擬器未來更新的主要工作.
[1] Fung W W L, Sham I, Yuan G, et al. Dynamic Warp Formation and Scheduling for Efficient GPU Control Flow[C]. Chicago, IL: 2007.
[2] Bakhoda A, Yuan G, Fung W W L, et al. Analyzing CUDA Workloads Using a Detailed GPU Simulator[Z]. Boston, MA: 2009.
[3] Shuai C, Boyer M, Jiayuan M, et al. Rodinia: A benchmark suite for heterogeneous computing[C]. 2009.
[4] He B, Fang W, Luo Q, et al. Mars: A MapReduce Framework on Graphics Processors[Z]. New York, NY: 2008, 260-269.
[5] Stratton J A, Rodrigues C, Sung I, et al. Parboil: A Revised Benchmark Suite for Scientific and Commercial Throughput Computing[R]. University of Illinois at Urbana-Champaign, 2012.
[6] NVIDIA. CUDA-GDB CUDA DEBUFER v5.0[Z],2012.
[7] NVIDIA. NVIDIA Nsight Visual Studio Edition 4.0 User Guide[Z] ,2014.
Analysis and Debug of GPGPU-Sim Simulator
Cao Jian-Li1Lai Hong-Hui2Rui Zhang-Xian3
(1. College of Mathematics and Science, Luoyang Normal University, Luoyang 471934, China ;2. School of Information Engineering, Gannan Medical University, Ganzhou 341000, China;3. Tongling Rui Jia specialty materials company, TongLing 244000, China )
General-Purpose Graphic Processing Units (GPGPU) have been widely used in many scientific research fields as accelerators due to their tremendous computing horsepower by running tens of thousands of threads concurrently. It makes the architecture of GPGPU the hotspot of research. With high usability and configurability, architecture simulator comes to be the primary methods of researchers. This paper analyses the principle, realize details and simulating process of GPGPU-Sim, it is useful for researchers of GPU architecture.
GPGPU; simulator; dynamic linking library; debug
TP31
A
1009-4970(2017)11-0052-04
2017-03-05
國家自然科學(xué)基金(61572246); 河南省科技創(chuàng)新人才支持計(jì)劃(164100510003)
曹建立(1978—), 男, 河南洛陽人, 博士, 講師. 研究方向: 計(jì)算機(jī)體系結(jié)構(gòu)和智能算法.
[責(zé)任編輯 徐 剛]