GPGPU-Sim的原理与调试

2017-12-22 07:17曹建立赖宏慧芮璋现
洛阳师范学院学报 2017年11期
关键词:源代码二进制体系结构

曹建立, 赖宏慧, 芮璋现

(1.洛阳师范学院数学科学学院,河南洛阳 471934;2. 赣南医学院信息工程学院,江西赣州 341000;3. 铜陵瑞嘉特种材料有限公司,安徽铜陵 244000)

GPGPU-Sim的原理与调试

曹建立1, 赖宏慧2, 芮璋现3

(1.洛阳师范学院数学科学学院,河南洛阳 471934;2. 赣南医学院信息工程学院,江西赣州 341000;3. 铜陵瑞嘉特种材料有限公司,安徽铜陵 244000)

本文对GPGPU-Sim模拟器的原理、 实现细节和运行过程进行了分析, 并介绍了使用GDB对其运行过程进行动态追踪的方法.

GPU通用计算; 模拟器; 动态链接库; 调试

0 引言

GPGPU体系结构模拟器有着低成本、 高灵活性和高度可配置性的优点, 因此在体系结构研究中得到了广泛的应用. 体系结构研究者的新设计、 新算法可以在模拟器中通过修改配置文件、 源代码得到快速实现, 并可通过运行不同类型的benchmark来收集运行结果, 从而可完成对其性能、 功耗评测, 进而可对目标处理器的结构进行改进和优化. 国际上有大量的学术论文、 专利等研究成果都基于开源模拟器平台, 如GEM5和SimpleScalar. 各大处理器生产公司的研发部门也有自己的模拟器平台, 如IBM的BGLsim模拟器, AMD和HP共同开发的COTSon模拟器.

近年来, 随着GPU(Graphics Processing Unit, 图形处理器)浮点运算能力的迅速提升,GPU通用计算(General-Purpose computation on GPU)在模拟核聚变、 气象预测、 基因工程、 遥感数据处理、 电子商务、 数据挖掘、 大数据等非图形应用领域得到了广泛应用, 使得GPU的优化成为体系结构领域的一个研究热点.

GPGPU-Sim[1]是University of British Columbia的Tor Aamodt等人开发的GPU体系结构模拟器, 用于模拟NVIDIA的Fermi和GT200架构的GPU. 其官方网站网址为http://www.gpgpu-sim.org.

本文分析了CUDA程序的编译过程,介绍了GPGPU-Sim模拟器的运行原理和常用的基准测试套件,最后研究了GPGPU-Sim的动态调试方法.

1 CUDA的编译过程

CUDA(Compute Unified Device Architecture), 是NVIDIA公司推出的运行在其公司硬件上的运算平台. 该平台大大简化了GPU并行程序的开发过程. CUDA提供的运行时API, 封装在libcudart.so/libcudart.a中. 更底层的驱动API则封装在libcuda.so中(在Windows操作系统中, 运行时API封装在cudart.dll/cudart.lib中, 驱动API封装在nvcuda.dll中). CUDA程序的调用过程如图1所示.

图1 CUDA的调用过程

CUDA提供的nvcc是一个编译驱动, 在不同的阶段分别调用CUDA安装目录下bin子目录中的nvopencc、 ptxas、 fatbin、 cudafe工具, 将CUDA源代码中的CPU代码和GPU代码分离, 并将GPU代码编译成PTX中间代码和多个不同版本的硬件二进制SASS代码. 源代码中的CPU代码部分用GCC编译器(Windows下可用微软的CL编译器)编译为二进制代码. 最终, nvcc将CPU的二进制代码、 PTX中间代码和SASS二进制代码合并成为可执行文件.

在CUDA并行程序执行时, 程序中的CPU代码在CPU上执行. 需要GPU运行的代码和待处理数据则会通过PCI-E总线发送到GPU端, GPU会选择适合当前硬件架构的SASS二进制版本来执行. 如果程序中包含的全部二进制SASS版本和当前硬件都不匹配, 则GPU会启动JIT(Just In Time Complilation, 即时编译), 先将程序中包含的PTX中间代码即时编译为适合当前硬件架构的二进制SASS代码, 然后再执行. 因此, 有些GPU程序在第一次执行时, 速度较慢, 第二次执行时, 因为已经缓存了即时编译后的二进制代码, 则执行速度会提升. 在进行性能测试时, 一般要进行多次, 取平均值, 并且将第一次执行的性能结果忽略不计.

2 GPGPU-Sim的模拟原理

GPGPU-Sim运行在Linux系统下, 其实现代码根据功能分布在几个目录中: cuda-sim目录中的代码功能为分析和模拟PTX指令; gpgpu-sim目录中的代码实现性能模拟和可视化数据收集; gpu-watch目录中代码实现了功耗模拟; intersim2目录中的代码实现了处理器核心和显存之间的互联网络. 整个模拟器用C++实现, 并利用堆栈、 队列、 数组、 哈希表、 图等数据结构创建了一个可以执行PTX/SASS指令的GPU模型, 在此模型上实现了大部分的CUDA函数调用, 最终将这些模块封装为动态链接库libcudart.so、 libOpenCL.so.

使用GPGPU-Sim时, 需要将系统动态链接库查找路径变量LD_LIBRARY_PATH指向这两个动态链接库所在的目录, 替代CUDA ToolKit安装后的lib目录. 当CUDA程序运行时, 原本应该由GPU执行的PTX/SASS指令和CUDA的调用则被GPGPU-Sim模拟器拦截, 在CPU上模拟执行. 调用过程如图2所示.

待执行结束, 会输出一份包含IPC、 缓存缺失率、 流处理器利用率、 显存访问次数等信息的报告, 通过分析该报告, 研究者可以分析出性能瓶颈并对GPU体系结构作出针对性的改进. GPGPU-Sim仅在运行时API层次上模拟了CUDA, 因此无法运行包含了驱动API的CUDA程序.

图2 GPGPU-Sim的调用过程

模拟器模拟的硬件通过gpgpusim.config配置文件来描述, GPGPU-Sim提供了GTX480、 Tesla2050、 QuadroFX5580/5600/5800显卡的配置文件. 用户也可通过修改配置文件来修改目标GPU的流处理器数量、 warp调度器数量、 调度策略和显存容量等参数. 例如, warp调度器可以设定为LRR循环算法、 GTO贪心算法、 Two level两级调度算法; 缓存淘汰策略可以设置为FIFO先进先出算法、 LRU最近最久未用算法、 Random随机置换算法.

而更深入的研究, 例如创建新的warp/CTA调度算法、 新的显存管理策略, 则需要研究者自己通过修改模拟器源代码的方法来实现.

3 常用的基准测试套件

研究者一般通过在模拟器上运行基准测试套件(Benchmark Suite)来衡量处理器的性能, 对比不同架构方案的优劣. 套件中包含了不同类型和特征的测试程序, 如计算密集型和访存密集型, 能较为全面地代表不同类型的应用程序. 在GPU体系结构研究领域, 常用的基准测试套件有GPGPU-Sim团队在ISPASS 2009 paper[2]中使用的测试套件, 弗吉尼亚大学计算机科学系开发的Rodinia[3], 新浪和微软合作开发的Mars[4], 伊利诺伊大学香槟分校可信与高性能计算中心开发的Parboil[5]等.

一个基准测试套件一般包含十几到几十个测试程序, 可能还需要在不同配置下多次运行, 会产生大量的输出报告, 从输出报告中人工查找所需的参数是个较为繁琐的工作. 可以使用grep、 awk、 sed等工具和Shell脚本来完成数据的收集和制表工作, 然后导入到Matlab或者Excel中来进行统计分析.

4 动态调试过程

在GPU体系结构的研究过程中, 需要分析和修改模拟器的源代码. 静态分析往往难以理解其运行原理. 修改源代码后执行出现异常, 静态分析也难以找到逻辑错误. 这时, 需要使用GDB工具对模拟器进行动态的调试除错.

GPGPU-Sim提供了调试模式. 如果在模拟器运行前, 将系统环境变量GPGPUSIM_DEBUG设为1, 则GPGPU-Sim启动后, 遇到CUDA的Kernel函数时, 会进入调试模式. 在该模式下, 可以单步执行程序, 也可以显示处理器流水线的状态. 但在实践中, 这种调试方法不够稳定, 和成熟的调试器GDB相比, 也不够灵活. 因此, 不建议使用该调试方法.

使用GDB, 既可以调试CUDA程序, 也可以调试模拟器本身, 方法是在适当的位置设置断点. 调试过程如下:

(1)编译模拟器时, 需要编译为debug版本. 具体命令为:

source setup_environment debug

make

(2)编译CUDA应用程序时, 也将其编译为debug版本, 其代码是:

nvcc -g myprog.cu -o myprog

(3)用GDB载入程序. 其代码是:

gdb myprog

gdb会载入程序和调试程序所需的源代码和符号表.

(4)如需调试CUDA程序, 则在CUDA程序中设定断点, 其代码是:

break main

(5)如果需要调试模拟器, 则在模拟器代码中设置行号断点, 其代码是:

break shader.cc:180

或者函数断点:

break scheduler_unit::cycle()

(6)运行程序, 其代码是:

Run

运行程序后, 模拟器的源代码已经被编译为动态链接库, 当CUDA程序发出CUDA函数调用时, 动态链接库会被载入内存执行, 当遇到断点时会停下来, 此时可以观察变量值和调用堆栈, 并单步运行, 以分析程序运行是否正常.

GPGPU-Sim模拟器的gpgpu_sim::cycle()函数会访问一个全局标志变量g_single_step,该变量值如果不为0, 则模拟器运行的周期数超过该值后, 每个周期都会触发一个单步中断.

GPGPU-Sim还提供了GDB的脚本文件.gdbinit, 以帮助用户在调试时查看模拟器的内部状态. 该文件中定义了多个宏. 其中, 宏dp 通过调用GPGPU-Sim中的函数g_the_gpu->dump_pipeline()来显示指定核心的流水线中各段的工作状态, 是观察模拟器内部的常用命令. 用户也可以在源代码中修改该函数, 以完成自己的特定任务.

上述调试方法针对的是GPGPU-Sim模拟器, 如果在GPU硬件上调试CUDA程序, 则可利用Nvidia提供的CUDA-GDB[6]和图形界面调试工具Nsight[7], 这样会更为便捷.

5 结语

GPGPU-Sim是一款高精度、 易配置、 易使用的GPU模拟器. 使用该模拟器可以迅速验证NVIDIA GPU的设计原型和优化方案, 其在科研工作者中得到了广泛的使用. 本文分析了该模拟器的模拟机制以及用GDB进行调试的过程.

该模拟器在Google Group上拥有开发者群对其进行维护和更新, 其网址为http://groups.google.com/group/gpgpu-sim/, 最新版可以支持CUDA7.0的一些特性. 但其内核模拟的是Fermi架构, 对于Kepler、 Pascal架构的显卡模拟精度较低, 这也是该模拟器未来更新的主要工作.

[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

国家自然科学基金(61572246); 河南省科技创新人才支持计划(164100510003)

曹建立(1978—), 男, 河南洛阳人, 博士, 讲师. 研究方向: 计算机体系结构和智能算法.

[责任编辑 徐 刚]

猜你喜欢
源代码二进制体系结构
用二进制解一道高中数学联赛数论题
基于TXL的源代码插桩技术研究
有趣的进度
二进制在竞赛题中的应用
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
基于粒计算的武器装备体系结构超网络模型
作战体系结构稳定性突变分析
揭秘龙湖产品“源代码”
二进制宽带毫米波合成器设计与分析