MARSSx86

MARSSx86 (MARSS for short) is a tool for cycle accurate full system simulation of the x86-64 architecture, specifically multicore implementations.

MARSSx86은 cycle accurate multicore x86 full system simulator이다. Cycle accurate하다는 점, multicore simulation이 가능하다는 점, x86 simulation이 가능하다는 점이 장점이다. 하지만 요즘에는 소스 코드가 업데이트되지 않아, 나중에는 사용하기 힘들 수 있다는 단점이 있다.

MARSSx86은 emulator인 QEMU와 simulator인 PTLsim를 통합해 만들었다. Emulation은 QEMU의 emulation path를 따르며(왼쪽 화살표), simulation은 PTLsim의 simulation path를 따라서 진행된다(오른쪽 화살표).

 
1. Download MARSS Source Code
코드는 git에서 받을 수 있다.

$git clone git://github.com/avadhpatel/marss.git

 
2. Compiling MARSS
MARSS는 scons를 사용해 빌드할 수 있다.

$scons -Q

한 개 이상의 코어를 simulate하고 싶으면, c 옵션으로 코어 개수를 줄 수 있다.

$scons -Q c=4

debug 메시지를 보고싶으면 debug 옵션을 주면 된다.

$scons -Q debug=1

Clean하고 싶으면 다음 -c 옵션을 주면 된다.

$scons -Q -c

빌드 중에 총 세 곳에서 에러가 발생했다. (sdl-config, gnutls, curl-config)

/bin/sh: 1: sdl-config: not found
ERROR: SDL library not found
Package gnutls was not found in the pkg-config search path.
Perhaps you should add the directory containing `gnutls.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gnutls' found
VNC TLS support not found, TLS support disabled
/bin/sh: 1: curl-config: not found
Warning: QEMU requires SDL or Cocoa for GUI output.
        can't find SDL or cocoa support so use VNC or curses interface

다음의 패키지들을 설치하면 에러가 발생하지 않는다.

$sudo apt-get install libsdl1.2-dev libgnutls-dev libcurl4-gnutls-dev

 
3. Machine Configuration
MARSS는 YAML을 사용해 machine configuration을 설정할 수 있도록 하고 있다[4]. MARSS에서는 몇 가지 기본 설정을 제공하고 있다. (./config 디렉토리 참고) config 옵션 없이 scons 명령으로 MARSS를 빌드하면 default.conf를 사용해 빌드하게 된다. 만약 새롭게 구성한 my_machine.conf로 MARSS를 빌드하고 싶다면, scons의 옵션으로 주면 된다.

$scons -Q config=my_machine.conf

Machine configuration을 만드는 방법은 [4]를 참고하면 쉽게 이해할 수 있다.

 
4. Create a Disk Image
MARSS를 사용하려면 디스크 이미지가 필요하다. 디스크 이미지는 직접 만들 수도 있고, MARSS에서 제공하는 디스크 이미지를 사용할 수도 있다. MARSS에서 세 가지의 이미지를 제공한다[5]. (Ubuntu 11.04가 설치된 이미지, Parsec이 설치된 이미지, Splash2가 설치된 이미지)
하지만 최신 커널을 적용하고, 원하는 벤치마크를 세팅하려면 disk image를 직접 만드는 것이 더 편하다. MARSS의 documentation에서는 VM 이미지 생성에 ubuntu-vm-builder를 사용하고 있는데, 나는 다른 방법으로 이미지를 생성했다[6, 7, 8, 9]. (ubuntu-vm-builder에서 원하는대로 설정을 주기 힘들었다.)

$qemu-img create -f qcow2 -o compat=0.10 ubuntu-14-trusty-clean.qcow2 50G

현재 MARSS 버전에서 qcow2 이미지를 생성할 때, 반드시 compat=0.10 옵션을 주어야 한다. 그렇지 않으면 compat=1.1로 이미지가 생성되며, MARSS에서 에러가 발생한다[10]. 또는 MARSS에서 제공하는 qemu-img 바이너리를 사용해도 된다. (Thanks to Jungi Jeong)

다음 명령어로 VM을 실행한다.

$./qemu/qemu-system-x86_64 -m memory_size -hda path/to/vm-img.qcow2 -cdrom path/to/ubuntu-14.04-desktop-amd64.iso -enable-kvm -vnc :1

DHCP로 설정해주어야 네트워크 사용이 가능하다. DHCP로 설정되어 있지 않다면, /etc/network/interfaces를 수정해 네트워크 설정을 해준다.

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Ubuntu를 설치한 뒤, 텍스트 모드로 부팅되도록 설정해야 한다.
/etc/default/grub에서 다음과 같이 수정한다.

GRUB_CMDLINE_LINUX_DEFAULT="text console=tty0 idle=poll"

이를 적용하기 위해 update-grub을 해준다.

$sudo update-grub

그 다음으로 원격에서 시리얼 콘솔로 접속 가능하도록 설정한다.
/etc/init/ttyS0.conf를 수정한다[11].
이 설정은 ./util/create_checkpoints.py로 checkpoint를 생성하기 위한 것이다.

# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[012345]
stop on runlevel [!012345]

respawn
exec /sbin/getty -L 115200 ttyS0 vt102

root로 로그인할 수 있도록, root에 비밀번호를 설정한다.

$sudo passwd root

 
5. Running MARSS
MARSS를 빌드하고, 이미지가 준비되면 다음과 같이 MARSS를 실행할 수 있다.

$cd $MARSS
$qemu/qemu-system-x86_64 -m [memory_size] -hda [path-to-qemu-disk-image]

이렇게 MARSS를 시작하면 VM은 emulation path를 따라 실행된다. Simulation을 시작하는 방법에는 네 가지가 있다. 1) Terminal의 QEMU console을 사용하는 방법, 2) VNC의 QEMU console을 사용하는 방법, 3) simconfig file을 사용하는 방법, 4) ./util/run_bench.py를 사용하는 방법이 있다.

1) Terminal의 QEMU console을 사용하는 방법
다음과 같이 실행하면 qemu console이 명령창에 뜬다.

$./qemu/qemu-system-x86_64 -m [memory_size]-serial pty -nographic -drive cache=unsafe,file=[path-to-qemu-disk-image] -vnc :1
(qemu)

VM에 접속해서 원하는 워크로드를 실행한 뒤에, QEMU에 simconfig 명령을 내린다.

(qemu) simconfig -run -stopinsns [stopinsns-count] -stats [stats-filename] -logfile [log-filename] -machine MACHINE_NAME

2) VNC에서 QEMU console을 사용하는 방법
MARSS를 실행하고 VNC에 접속한 뒤, 실행하고자 하는 benchmark를 실행한다. ‘Ctrl-Alt-2’를 입력해 QEMU monitor console로 이동한다.

(qemu)

simconfig 명령을 입력해 simulation을 시작할 수 있다[12].

(qemu) simconfig -run -stopinsns [stopinsns-count] -stats [stats-filename] -logfile [log-filename] -machine MACHINE_NAME

 
3) simconfig file을 사용하는 방법
config file에 원하는 simulation을 설정한다.

 # Sample Marss simconfig file
 -machine MACHINE_NAME
 -stopinsns [stopinsns-count]
 -stats [stats-filename]
 -logfile [log-filename]
 -run

MARSS를 실행할 때 config file을 옵션으로 주어 실행한다.

$qemu/qemu-system-x86_64 -m [memory_size] -hda [path-to-qemu-disk-image] -simconfig [simulator-config-file]

하지만 일반적인 경우 여러 가지의 세팅으로 많은 실험을 동시에 해야 하므로, checkpoint를 사용해 실험하는 것이 일반적이다. 이것이 네 번째 방법인 ./util/run_bench.py를 사용하는 방법이다. 이 방법은 Section 6, 7, 8에서 설명하겠다.

 
6. Create Checkpoints
Checkpoint를 사용해 MARSS를 실행하는 방법을 알아보기 전에, checkpoint 생성 방법부터 알아보자. PTLcall function을 사용해 checkpoint를 생성할 수 있다. Checkpoint를 생성하는 방법을 이해하려면, 우선 PTLcall function을 이해해야 한다. PTLcall 함수는 MARSS가 emulation과 simulation을 switch할 수 있도록 하는 함수들이다[13].
PTLcall function을 사용해 만든 프로그램으로 simulation을 시작/중지하거나, checkpoint를 생성할 수 있다. PTLcall function을 이해하기 위해 simulation을 switch하는 예제를 살펴보자.
start_sim.c, kill_sim.c의 코드가 아래와 같다고 하자.
start_sim.c

#include "ptlcalls.h"
#include <stdio.h>

int main() {

	printf("Switching to simulation\n");
	ptlcall_switch_to_sim();
	return 0;
}

kill_sim.c

#include "ptlcalls.h"
#include <stdio.h>

int main() {

	printf("Stopping simulation\n");
	ptlcall_kill();
	return 0;
}

이 두 파일을 컴파일해 start_sim, kill_sim 바이너리를 만들었다고 하자. Simulation은 다음과 같이 할 수 있다.

$./start_sim; ./[your_benchmark] [benchmark_options] ; ./kill_sim

마찬가지 방식으로, checkpoint를 생성하는 함수를 사용해 checkpoint를 생성할 수 있다. (ptlcall_checkpoint) 다행히도 create_checkpoint, kill_sim binary는 MARSS에서 제공한다. MARSS에서 제공하는 VM 이미지 안에 포함되어 있다. 이를 사용해 checkpoint를 생성할 수 있다.

 
7. Create Checkpoints Remotely
앞에서 살펴본 방법으로는 여러 개의 checkpoint를 동시에 생성하기 힘들다. MARSS에서 제공하는 스크립트를 사용하면 여러 개의 checkpoint를 동시에 생성할 수 있다. ./util/create_checkpoints.py를 사용해 여러 개의 checkpoint를 동시에 생성할 수 있다. 이 코드를 잘 살펴본 뒤, 자신의 환경에 맞게 수정하고 MARSS 디렉토리에서 실행하면 된다. qemu_img, vm_memory, checkpoint 생성 명령어 등을 수정하면 된다.

$./util/create_checkpoints.py

유의 사항
1) 벤치마크 실행의 결과가 stdout으로 출력되는데, 이로 인해 MARSS가 멈춰버릴 수 있다. 출력은 /dev/null로 보내는 것이 좋다.
2) 벤치마크 실행 명령어를 잘 확인해보아야 한다. 예상대로 실행되지 않기도 한다. (parsec_list, spec_list 등에 포함되는 명령어)

 
8. Running MARSS with Checkpoints
MARSS에서 checkpoint를 생성하고, 이를 사용해 실험을 할 수 있다. ./util/util.cfg에서 실험 환경을 설정하고, 이를 ./util/run_bench.py로 실행하면 된다.

./util/util.cfg에 다음과 같이 쓰여있다고 하자.

[DEFAULT]
marss_dir = /path/to/your/marss/dir
util_dir = /path/to/your/marss/utils/dir
img_dir = /path/to/qcow2/disk/images

qemu_bin = %(marss_dir)s/qemu/qemu-system-x86_64

default_simconfig = -kill-after-run -quiet

xoauth = xoauth.txt
to = youremail@domain.com

[suite name]
checkpoints = chk1, chk2, chk3

[suite spec2006-int]
checkpoints = perl, bzip, gcc, mcf, gobmk, hmmer, sjeng

[run name]
suite = suite_name
images = /image1, /image2
memory = 2G
simconfig = -logfile %(out_dir)s/%(bench)s.log
  -stats %(out_dir)s/%(bench)s.yml
  -machine machineX
  %(default_simconfig)s

[run spec-int-ooo]
suite = spec2006-int
images = %(img_dir)s/spec_1.qcow2
  %(img_dir)s/spec_2.qcow2
  %(img_dir)s/spec_3.qcow2
memory = 2G
simconfig = -logfile %(out_dir)s/%(bench)s.log
  -stats %(out_dir)s/%(bench)s.yml
  -machine ooo
  %(default_simconfig)s

위 코드에서 볼 수 있듯이, util.cfg에서 MARSS의 경로, util directory의 경로, image의 경로, 실험하고자 하는 checkpoint의 목록, simconfig를 설정해주면 된다.

spec-int-ooo 실험을 하려면 다음과 같이 실행하면 된다.

$./util/run_bench.py spec-int-ooo -d output/

 
9. Simulation Results/Statistics
Simulation 결과는 YAML 형식으로 저장된다. MARSS는 결과를 쉽게 추출해낼 수 있도록 util 디렉토리 아래에 mstats.py를 제공한다[14].

$./util/mstats.py
Usage: mstats.py [options] args

Options:
  -h, --help            show this help message and exit

  Input Options:
    -y, --yaml          Treat arguments as input YAML files
    --time-stats        Input time stats file
    --sp-weights=SP_WEIGHTS
                        Provide Simpoint Weight file
    --sp-pfx=SP_PFX     Simpoint prefix used to filter stats

  Stats Filtering Options:
    -t TAGS, --tags=TAGS
                        Specify tag search pattern. (Ex. astar|gcc to match
                        either one)
    -n NODE, --node=NODE
                        Select only given node, format: nodeA::nodeB::nodeC.
                        You can also use Regular expressions to select
                        multiple nodes at same level.

  PostProcess Options:
    --sum               Sum of all selected nodes
    --sum-all=SUM_ALL   Sum of all stats
    --cache-summary     Print summary of cache stats

  Output Options:
    --time-col=TIME_COL
                        Label of column for creating graph, to add separate
                        title name use COL_NAME,TITLE_NAME format
    --time-graph=TIME_GRAPH
                        Output file name
    --time-list-idx     Print the column title and its index
    --yaml-out          Print output in YAML format
    --flatten           Print result in flattened format
    --flatten-sep=FLATTEN_SEP
                        Print result in flattened format
    --hist              Print Histogram of given node
    --csv               Print comma separated output of given node
    --csv-list-indexed  Print each element of list in new row
    --cache-summary-type=CACHE_SUMMARY_TYPE
                        Cache summary output type
    --table             Output data in a table format

아주 간단한 예제를 살펴보자. 출력 파일로 다음과 같은 yaml 파일이 생성되었다고 하자.

base_machine:
  ooo_0:
    cycles: 580570
...

여기서 cycle 정보를 추출하려면, 적절한 옵션을 주어 mstats.py를 실행하면 된다.

$./mstats.py -y --flatten -n base_machine::ooo_0::cycles ./../output/stats.yml

유의 사항
MARSSx86을 사용할 때, 이미지에 snapshot을 생성하고 지우는 것을 반복하면 이미지가 망가진다. (invalid opcode 에러 발생)

References :
[1] MARSSx86, http://marss86.org/~marss86/index.php/Home
[2] MARSS: Micro Architectural Systems Simulator, https://cloud.github.com/downloads/avadhpatel/marss/Marss_ISCA_2012_tutorial.pdf
[3] Documentation, MARSSx86, http://marss86.org/~marss86/index.php/Documentation
[4] Machine Configuration, MARSSx86, http://marss86.org/~marss86/index.php/Machine_Configuration
[5] Disk Images, MARSSx86, http://marss86.org/~marss86/index.php/Disk_Images
[6] ubuntu-vm-builder, Ubuntu Manuals, http://manpages.ubuntu.com/manpages/hardy/man1/ubuntu-vm-builder.1.html
[7] Kernel does not support a non-PAE CPU install KVM guest on Ubuntu 13.10 – Fix, RandomHacks, http://www.randomhacks.co.uk/kernel-does-not-support-a-non-pae-cpu-install-kvm-guest-on-ubuntu-13-10-fix/
[8] Custom Disk Images, MARSSx86, http://marss86.org/~marss86/index.php/Custom_Disk_Images
[9] QEMU/Images, QEMU, http://en.wikibooks.org/wiki/QEMU/Images
[10] qemu-img should be able to tell the compat version of a qcow2 image, Red Hat Bugzilla, https://bugzilla.redhat.com/show_bug.cgi?id=980771
[11] QEMU Tips, MARSSx86, http://marss86.org/~marss86/index.php/QEMU_Tips
[12] Simconfig, MARSSx86, http://marss86.org/~marss86/index.php/Simconfig
[13] Checkpoints in MARSS, MARSSx86, http://marss86.org/~marss86/index.php/Checkpoints_in_MARSS
[14] Statistics Collection, MARSSx86, http://marss86.org/~marss86/index.php/Statistics_Collection
[15] Matt T. Yourst, PTLsim User’s Guide and Reference, http://www.facom.ufms.br/~ricardo/Courses/CompArchII/Tools/PTLSim/PTLsimManual.pdf

Advertisements
Tagged with: , , , , ,
Posted in 2) Computer Engineering
19 comments on “MARSSx86
  1. Jungi Jeong says:

    If you get this error when trying [5. Running MARSS]…

    “qemu-system-x86_64: -hda xxx.qcow2: ‘ide0-hd0’ uses a qcow2 feature which is not supported by this qemu version: QCOW version 3”

    you can avoid this either
    1. running qemu-img with compat=0.1 as gundaeng mentioned
    or
    2. using qemu-img from the build directory (path_to_marss/qemu/qemu-img) instead of default qemu-img, they have different version number.

  2. […] 이미지를 만들 때 처음부터 불필요한 서비스는 […]

  3. MSC says:

    안녕하세요. DRAMSim에 관련해서 여기저기 검색하다가 여기까지 오게 된 한 학생입니다.
    DRAMSim과 MARSS 관련 글 읽으면서 따라하다가 이제 ./start_sim으로 결과까지 얻어내긴했는데요… .vis 파일에 가서 확인해보니 parameter들 밖에 없고 epoch_data같은 배열 이름만 적혀있더군요.. (Power[0][0][3] 이런식으로..) 제가 아직 볼줄 몰라서 그런데.. 이 vis파일은 어떻게 분석해야하는 것인지 조금만 도움을 주실수 있으신가요.. 감사합니다.

  4. […] 공부하기 4. SPEC을 사용할 때 trace를 사용한다 하는데, trace가 무엇인지? 5. MARSSx86 사용법 알아보기 6. Introduction to parallel computing 2nd Edition, Ananth Grama, George Karypis, Vipin […]

  5. JJY says:

    안녕하세요 메모리를 공부하다가 여기까지 오게된 학생입니다.
    써주신 글을 참고하여 환경을 구축하는 것은 성공했습니다. 좋은 글 정말 감사합니다.
    메모리 controller를 공부하려고 하는데 스케쥴러가 되기 전인 command의
    상황(같은 cycle에서)을 DRAMSim2에서 볼 수 있는 방법은 없는지… 가능하면
    어떻게 하면 볼 수 있는지에 대해서 도움을 주실 수 있으신가요 ? … 감사합니다.

    • gumdaeng says:

      죄송합니다만 질문을 이해하기가 다소 힘듭니다. “스케쥴러가 되기 전”이라는 말이 무엇인지 모르겠습니다. 특정 상황에서 DRAMSim2의 내부 상태를 보고싶다는 말씀이신 것 같은데, 저는 DRAMSim2를 직접 수정해보지는 않아서 잘 모릅니다. 이미 구현되어있지 않은 기능이라면 직접 구현하셔야 할 듯 합니다.

  6. Dongshin says:

    안녕하세요, 검댕님 홈페이지에서 marss.dramsim과 DRAMSim2의 환경구성 등을 보고 구성한 사람입니다. 우선, 글 덕택에 구성을 해서 감사드린다는 말씀을 드립니다. 그 이후에 이러저러 시뮬레이션을 좀 해보려고 marss에서 제공하는 parsecROI 이미지를 받아서 돌렸는데요.. 실험 결과가 맞는지 안맞는지.. 가르쳐줄 사람이 없어서 답답한 마음에 염치불구하고 여기에 글 하나 남깁니다. marss-devel에서 어떤 유저가 parsecROI.img로 시뮬레이션 하고 싶을 때, ./start_sim; parsecmgmt -a run -x roi -c gcc-hooks -p facesim -i simlarge -n 4; .stop_sim 이런식으로 글 쓴 것을 보게 되어 이대로 qemu 창에다가 입력하고 결과를 받았는데요. 그런데.. 제가 다른 workload들을 올렸을 때, marss.dramsim에 나오는 dramsim.log들을 확인해보니 access 횟수가 3000~4000번(-stopinsns 100000으로 제한시켰을 때..)정도로 다 일정하게 나오더라구요.. 이 결과가 맞는 것인지.. (workload마다 특성이 있을 것인데..예를 들어 memory access를 덜하는 것 많이 하는 것들이 마음에 걸려서 드리는 말씀입니다..) 혹은 저기 명령어에서 parsecmgmt 가 아닌 다른 것을 입력해야되는지.. 도와줄 사람이 없어서 이렇게 질문드립니다.. 갑작스레 이렇게 댓글 남겨서 죄송합니다.

    • gumdaeng says:

      안녕하세요. 우선 한 가지 확실히 해야 할 것은, 질문자님께서 이야기하신 “qemu 창”이 무엇인지입니다. qemu에서 돌아가는 머신(리눅스)의 명령창을 의미하는지, qemu 커맨드를 의미하는지 궁금합니다. “./start_sim; parsecmgmt -a run -x roi -c gcc-hooks -p facesim -i simlarge -n 4; .stop_sim ” 과 같은 명령어는 qemu 커맨드 창이 아닌, qemu에서 돌아가는 머신(리눅스) 명령창에서 입력해야 합니다.
      본래의 질문으로 넘어가서, 특정 값이 맞는지 보는 방법은 특성이 뚜렷이 다른 두 워크로드를 돌려보고, 그 성능을 비교해보는 것밖에는 없습니다. 그럼에도 값이 이상하다면 시뮬레이터 코드에 오류가 있거나, 워크로드가 제대로 돌지 않는 문제일 것입니다.

      • Dongshin says:

        답변 감사합니다.제가 말씀드린 창은 qemu linux 명령창입니다.(ctrl+alt+2해서 simconfig 입력하는 것이 아닌 리눅스입니다.) 마지막으로 질문드릴 것은.. MARSS 홈페이지에서 시뮬레이션 하는 방법은 “./start_sim; ./[run your bench] [option]; ./stop_sim;” 이런식으로 되어있는데요. 각 벤치마크(SPEC, PARSEC등)의 실행을 입력하는게 맞는 것인지요..?
        예를들어, 전에 말씀드린 “./start_sim; parsecmgmt -a run -x roi -c gcc-hooks -p facesim -i simlarge -n 4; .stop_sim ” 이 명령어가 시뮬레이션 실행이 올바른 방법인지 알고 싶습니다. 물론 parsecmgmt는 PARSEC 혼자 실행할 때, 명령어니깐요. 이 위의 명령어가 맞는지.. 확인해주시면 감사하겠습니다.

        • gumdaeng says:

          기억에 따르면 그 방식이 맞습니다. 저는 그 방법으로 실험을 하지 않고 있습니다. 개인적으로 불편했기 때문이기도 하고, run_bench.py 스크립트를 사용하는 것이 실험 결과 정리가 편했기 때문입니다. 제가 보기에 시뮬레이션 실행 방법에는 문제가 없는 것 같습니다. xalancbmk, libquantum 등의 서로 상반되는 워크로드를 돌려보고 MPKI, miss rate을 보는 것이 좋은 방법이리라 생각합니다. 아니면 xalancbmk에 cache 할당량을 바꿔가며 miss rate을 보는 것도 좋을 듯 합니다.

          • Dongshin says:

            답변 감사드립니다. run_bench.py를 예전에 marss-devel에서 벤치마크 여러개 돌릴때 run_bench.py 쓰라고 하는 글을 본 듯한데.. 저도 이 것을 사용해서 하는 법을 연습해봐야겠네요. 정말 감사드립니다. 덕분에 많은 도움이 되었습니다. 앞으로 하시는 논문 작업 및 논문 accept, 잘 되시길 기도하겠습니다.

  7. […] = ‘pty’ 추가) [2]. HVM 내부에서 serial 포트를 여는 방법은 이전에 MARSSx86 설치 과정에서 한 적이 있다 (네 번째 섹션 참고). Xen에서 guest VM 콘솔에 접속할 때, […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 91,344 hits
%d bloggers like this: