SImulator and Benchmark/Zsim+ramulator (PIM simulator)

Zsim + Ramulator (PIM simulator)

H/W engineer_ beginner 2022. 6. 20. 17:02
SMALL

Zsim + Ramulaotor 는 Processing-in-Memory(PIM) 을 시뮬레이션 할 수 있는 프레임워워크로 향후 장기적으로 진행할 PIM 관련 연구의 Base line을 설정하기 위하여 정리했습니다.
 


I. Introduction

 

 Zsim+Ramulator 은 General-purpose processing-in-memory (PIM) 아키텍쳐를 시뮬레이션 하기 위한 빠르고 유연한 프레임워크 입니다. Ramulator-PIM으로도 불리는 이 프레임워크는 널리 사용되고 있는 두 시뮬레이터(*Zsim, *Ramulator)를 기반으로 만들어졌습니다.

  

 이 프레임워크의 Computing system에는 host CPU core와 General-purpose PIM core가 있습니다. PIM core들은 Ramulator의 HMC model (3D-stacked memory)안에 위치해 있으며, 시뮬레이션을 통해 두 종류의 core에서 실행되는 어플리케이션의 성능 차이를 확인할 수 있습니다. 즉, 동일한 프로그램을 CPU core 만을 사용하거나, General-purpose PIM core만을 사용해 시뮬레이션 하고 이 둘의 성능 차이를 확인할 수 있습니다. 이를 통해 여러 Benchmark program들을 두가지 옵션으로 실행하고 성능의 차이가 큰 프로그램들을 분류하여 분류된 프로그램들의 특징을 분석해보려 합니다. 

 

 본 시뮬레이터에서 ZSim은 Ramulator에 보낼 Memory trace를 생성합니다. PIM의 성능 측정을 위해 기존의 ZSim을 변형하여 두 가지 타입의 Memory trace가 생성되는데, 이들은 각각 host CPU trace를 위한 *Filtered traces와 PIM core를 위한 *Unfiltered traces로 불립니다.

 

 Ramulator는 ZSim을 통해 생성된 Filtered traces와 Unfiltered traces를 사용하여 두 코어의 메모리 엑세스를 시뮬레이션 합니다. 본 시뮬레이터에서는 PIM core를 시뮬레이션 하기 위해 Off-chip link overhead 를 피할수 있도록 수정되었습니다. 

 

 

Figure 1 [Repository Structure of Zsim+Ramulator] / Reference [1]

 

 

 

*Zsim: 널리 사용되는 x86-64 멀티코어 시뮬레이터 입니다.

*Ramulator: DDRx, LPDDRx, GDDRx, WIOx, HBMx 등을 포함한 여러 DRAM 아키텍쳐가 포함된 DRAM 시뮬레이터 입니다.

*Filtered traces: 메모리 컨트롤러의 요청에 의해 수집되는 정보로, host의 캐시 계층구조가 ZSim 내부에서 시뮬레이션 됩니다. ZSim을 통해 *Hardware prefetcher 또한 시뮬레이션 될 수 있습니다. (host CPU core를 위한 memory trace)

*Unfitered traces: 코어 파이프라인에서 Issue되는 즉시 모든 메모리 Request를 수집하는 방법입니다. (PIM core를 위한 memory trace)

*Hardware prefetcher: Software prefetch 처럼 캐시 블록을 인위적으로 제어하는 것이 아니라 하드웨어가 자동으로 프리패치 기능을 수행하는 것으로, 프로세서의 요청에 예상되는 메모리 블록을 미리 캐시에 페치합니다.

 

 

 


 

II. Setup

 

i) Installing

 

 ZSim과 Ramulator 모두를 사용하는 본 시뮬레이터를 사용하기 위하여 각 시뮬레이터의 Dependency들을 맞춰 설치하는 작업이 필요했습니다. 이를 위해 각 시뮬레이터의 Git hub Readme.md 의 설명을 참고하였으며 "Git clone" 명령으로 원하는 경로에 설치 파일들을 로드하는 것으로 시뮬레이터 설치를 시작할 수 있습니다. 본 시뮬레이터에서 설명하는 Dependency는 아래와 같습니다.

 

* ZSim: gcc >=4.6, pin, scons, libconfig, libhdf5, libelfg0

* Ramulator: C++11 compiler (e.g Clang++, g++-5)

 

 필요한 라이브러리들은 본 시뮬레이터의 setup.sh, compile.sh, make file에 모두 있으므로 설치 과정에서 컴파일러를 적합한 버젼으로 설정하는 것과 에러가 발생하는 특정 라이브러리가 맞는 버젼으로 설치될 수 있도록 수정하는 것 정도로 설치를 마무리 할 수 있습니다.

 

 

 

ii) Trouble shooting

 

(1) 'sh compile.sh' 명령어 입력 시 에러 발생 (aclocal-1.15 is missing on your system)

=> 'sudo apt install automake-1.15' 명령어 입력으로 해결하였습니다.

 

(2) 'ramulator make' 명령어 입력 시 에러 발생 ('~' can not be used when making a PIE object)

=> 본 에러는 make file의 컴파일러 버젼과 설치되는 리눅스 환경의 컴파일러 버젼이 달라 발생하는 에러로 판단됩니다.

=> ramulator directory 내부에 위치한 make file을 열어서 적합한 컴파일러 버젼을 입력 (CXX := g++5로 변경)

=> 터미널에서 'sudo update-alternatives --config g++/gcc' 명령어를 통해 모든 컴파일러 버젼 5로 맞춘 후 정상 동작하는 것을 확인할 수 있습니다.

 

 


 

 

III. How to use?

 

i) Generating Traces with Zsim

 ZSim에서 Trace를 생성하기 위해선 세 가지 단계가 필요합니다. 

1. zsim-ramulator/misc/hooks/zsim_hooks.h 경로의 파일 내부 코드를 참고하여 어플리케이션에서 측정할 코드 구역을 설정합니다.

2. ZSim을 위한 Configuration file들을 만듭니다.

3. 실행 파일을 실행합니다.

 각 단계의 세부 사항은 아래에 정리했습니다.

 


 

1. zsim-ramulator/misc/hooks/zsim_hooks.h 경로의 파일 내부 코드를 참고하여 어플리케이션에서 측정할 코드 구역을 설정합니다.

 먼저 어플리케이션에서 관심 있는 부분의 코드를 지정합니다. 본 시뮬레이터에서는 이 부분이 'offload region' 이라는 용어로 통용됩니다. 지정한 Region의 code는 PIM Core에서 실행되며 자세한 설명은 밑에 첨부한 코드를 참고 바랍니다.

 

#include "zsim-ramulator/misc/hooks/zsim_hooks.h"
foo(){
    /*
    * zsim_roi_begin() marks the beginning of the region of interest (ROI).
    * It must be included in a serial part of the code.
    */
	zsim_roi_begin(); 
	zsim_PIM_function_begin(); // Indicates the beginning of the code to simulate (hotspot).
	...
	zsim_PIM_function_end(); // Indicates the end of the code to simulate.
    /*
    * zsim_roi_end() marks the end of the ROI. 
    * It must be included in a serial part of the code. 
    */
	zsim_roi_end(); 
}

 

 

2. ZSim을 위한 Configuration file들을 만듭니다.

 Configuration file들은 Zsim으로 Application들을 실행시킬 때 사용됩니다. 본 시뮬레이터에서는 Filtered trace와 Unfiltered trace를 위한 Sample code 들을 zsim-ramulator/tests 경로에서 제공합니다. 이 샘플 코드들을 통해 Core의 갯수, 캐쉬 메모리의 사이즈와 갯수, Prefetcher의 갯수 등을 어떻게 설정하는지 확인할 수 있습니다. 

*Filtered configuration files: host.cfg, host_prefetch.cfg

*Unfiltered configuration file: pim.cfg

 

Figure 2 [Important nobs that can be changed in the configuration files]

 

 

3. 실행 파일을 실행합니다.

* Trace 생성 명령어

./build/opt/zsim configuration_file.cfg

 

*Trace format

THREAD_ID PROCESSOR_ID INSTR_NUM TYPE ADDRESS SIZE

 

Figure 3 [The fileds in the trace file]

 

**간단하게 요약하자면, 먼저 원하는 Application을 Compile한 후에 ZSim으로 어플리케이션에 대한 Configuration file을 생성해줍니다. Configuration file은 앞서 설명했듯, host CPU core를 위한 두 개의 파일과 PIM core를 위한 한 개의 파일로 구성되어 있습니다. 그 다음 './build/opt/zsim configuration_file' 명령어를 입력하여 Trace file들을 생성해 줍니다. 생성된 Trace file들은 Ramulator를 실행 할 때 사용되게 됩니다.

 

 

ii) Running Ramulator

1) To run the host simulation:

./ramulator --config Configs/host.cfg --disable-perf-scheduling true --mode=cpu --stats host.stats --trace sample_traces/host/rodiniaBFS.out --core-org=outOrder --number-cores=4 --trace-format=zsim --split-trace=true

2) To run the PIM simulation:

./ramulator --config Configs/pim.cfg --disable-perf-scheduling true --mode=cpu --stats pim.stats --trace sample_traces/pim/pim-rodiniaBFS.out --core-org=outOrder --number-cores=4 --trace-format=zsim --split-trace=true

 

* mode 설정을 위해서 Configuration file 내부에 pim_mode 값을 지정해 줍니다.

  pim_mode = 0 (for host)

  pim_mode = 1 (for pim)

 

Figure 4 [The important nobs for running ramulator]

 

 


 

 

IV. Reference

[1] https://github.com/CMU-SAFARI/ramulator-pim

 

GitHub - CMU-SAFARI/ramulator-pim: A fast and flexible simulation infrastructure for exploring general-purpose processing-in-mem

A fast and flexible simulation infrastructure for exploring general-purpose processing-in-memory (PIM) architectures. Ramulator-PIM combines a widely-used simulator for out-of-order and in-order pr...

github.com

[2] Yoongu Kim, Weikun Yang, and Onur Mutlu, "Ramulator: A Fast and Extensible DRAM Simulator". IEEE Computer Architecture Letters (CAL), March 2015.

[3] Gagandeep Singh, Juan Gomez-Luna, Giovanni Mariani, Geraldo Francisco de Oliveira, Stefano Corda, Sander Stujik, Onur Mutlu, and Henk Corporaal, "NAPEL: Near-Memory Computing Application Performance Prediction via Ensemble Learning". Proceedings of the 56th Design Automation Conference (DAC), Las Vegas, NV, USA, June 2019.

LIST