Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器,该小组隶属于原RAW Chip设计团队,并与Tilera公司关系紧密。Graphite通过对一系列计算机体系结构领域常用模拟器的集成,为研究者提供了一个全系统模拟环境。Graphite可模拟的部分包括:Memory Hierarchy、Cache、Directory、NOC等,并使用orion计算动态功耗。Graphite目前不支持core详细模拟,而是采用PIN来执行测试程序,并用截获的指令流来驱动整个模拟器。这种方式虽然限制了模拟器的exploration space,但是可以使得更多的真实负载可以被用于整个系统的测试。(在今年5月的IPDPS2012上,我遇到了MIT的George Kurian,他说目前Carbon正在考虑用一个详细的core模拟模块替换PIN,以使得Graphite可以满足未来Tilera的设计需要。)最为重要的是,该模拟器构建了一个统一的模拟器支持层,可实现并行模拟和分布式模拟。通过这种方式,研究者可以将模拟任务分不到若干计算机上进行,大大缩短了模拟实验的时间(这方面的一个反例就是目前常用的Simics-GEMS,进行一次16核的众核芯片模拟实验通常要1-2个星期)。在今年的IPDPS2012会议上,该研究组基于这个模拟器发表了一篇关于千核众核处理器的片上光互联的研究论文[1]。
Graphite Simulator的出现为研究更大规模的众核处理器提供了支持,使得研究人员有机会通过实验了解一个大型处理器芯片内各部分的变化对于整体性能的影响。自2009年该模拟器推出以来,已经有越来越多的研究人员开始关注这个工具,并将该工具引入到自己的研究工作中。Graphite Simulator的主页地址是:http://groups.csail.mit.edu/carbon/?page_id=111
我的下一步研究工作也将使用Graphite,因此我用了一段时间来配置这个工具。按照最初的想法,我希望能在CentOS 5.3 64位版上来运行这个工具,但是由于CentOS 5.3将部分futex由用户态改为了核心态,使得Graphite不能正常运行,所以这个移植工作暂时搁置了,以后有时间再做吧。本文介绍一下最基本的Graphite配置方法。
1. 运行环境:
操作系统:Debian 5.0(lenny)64位版
编译器:GCC 4.3.3 / GCC 4.4.7
其他库:boost 1.38
说明:目前Graphite只能在Debian 5或6上运行。在CentOS 5.3运行时,由于centos将<linux/futex.h>中的部分系统调用由用户态改为核心态,导致graphite在编译和运行时会出现异常。另外,由于GCC 4.5以上版本将部分C++的语言特性做了修改,导致graphite在编译时会出现异常。
2. 手动编译GCC
(1) 下载最新版GMP、MPFR和MPC
(2) 依次编译安装这三个库,注意,由于这三个库有前后依赖关系,所以顺序不能乱
a) 将这三个库分别解压到GMP、MPFR、MPC目录
b) 在上述目录相同的目录内建立编译用的临时目录build-gmp、build-mpfr、build-mpc
c) 在build-gmp目录中运行如下命令
i. ../GMP/configure --prefix=/usr/local/gmp
ii. make
iii. make check
iv. make install
d) 在build-mpfr目录中运行如下命令
i. ../MPFR/configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
ii. make
iii. make check
iv. make install
e) 在build-mpc目录中运行如下命令
i. ../MPC/configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/mpfr
ii. make
iii. make check
iv. make install
f) 为系统加入环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gmp/lib:/usr/local/mpfr/lib:/usr/local/mpc/lib
g) 将下载的gcc4.4.7解压到目录gcc,并在相同目录建立编译用的临时文件夹build-gcc
h) 在build-gcc中执行运行如下命令
i. ../gcc/configure --prefix=/usr/local/gcc-4.4.7 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc
ii. make
iii. make install
i) 将/usr/bin下的gcc和g++软连接指向/usr/local/gcc/bin下的gcc-4.4和g++-4.4
3. 安装boost 1.38
a) 解压下载的boost1.38压缩包至目录boost_1_38_0,并在同一位置建立目录boost
b) 运行boost_1_38_0/tools/jam/src中的build.sh,会在boost_1_38_0/tools/jam/src/bin.linux-x86_64/中得到可执行文件bjam,将这个文件复制到boost_1_38_0中
c) 在boost_1_38_0中运行如下命令
./bjam --prefix=$BUILD_DIR/boost --build-type=complete --with-filesystem --with-system install
d) 将boost文件夹中include中最内层的目录复制到/usr/local/include中,将boost/lib中所有文件复制到/usr/local/lib中
4. 编译Graphite
a) 解压下载的graphite包
b) 解压缩下载的pin,目前graphite只支持27887版的pin
c) 修改graphite中的Make.common,将其中的BOOST_VISION=1_35改为1_38,并将PIN_HOME的值改为pin的路径
d) 修改graphite/common/Make.common,将其中的BOOST_ROOT的值改为boost源码的路径(这里是boost_1_38_0),将BOOST_SUFFIX的值改为gcc44-mt-1_38
e) 修改graphite/tool中的spawn.py,将其中boost_path的值改为刚才编译boost的路径
f) 按如下说明修改graphite源码
i. 修改common/mcpat/mcpat_cache.cc,将其中system((cmd.str()).c_str());一句注释掉,改为__attribute(__unused__)int tmp = system((cmd.str()).c_str());
ii. 修改common/tile/core/main_core.h,将其中class MainCore : protected Core一行改为class MainCore : public Core
iii. 修改contrib/orion/Buffer/BitlineUnit.cc,在文件头部添加#include <cstdio>
iv. 修改contrib/orion/Buffer/OutdrvUnit.cc,在文件头部添加#include <cstdio>
v. 修改contrib/orion/Buffer/PrechargeUnit.cc,在文件头部添加#include <cstdio>
vi. 修改contrib/orion/Buffer/WordlineUnit.cc,在文件头部添加#include <cstdio>
vii. 将contrib/orion/Buffer中的sram.h和sram.cc文件名分别改为SRAM.h和SRAM.cc
g) 在graphite目录中make
h) 编译完成后,用自带的程序进行测试,执行make ping_pong_app_testCORES=16 PROCS=2
[1] G. Kurian, Chen Sun, and A. Agarwal etc, Cross-layer Energy and Performace Evaluation of a Nanophotonic Manycore Processor System using Real Application Workloads, in IPDPS'2012: IEEE International Parallel & Distributed Processing Symposium, May 2012.