20150102

1. MARSSx86에 버그가 있음을 확인함.
MARSSx86의 SPEC CPU 2006 시뮬레이션에서 리눅스 릴리즈 버전에 따른 오류가 있다.
Ubuntu release version 12, 13, 14 VM 이미지를 생성하고,
각각이 어떤 워크로드를 제대로 실행하는지 확인함. (SPEC CPU 2006 기준)

Ubuntu release version 12에서는 에러가 발생하는 워크로드가 없었음.

Ubuntu release version 13에서 에러가 발생하는 워크로드 (3개)

gobmk_score
mcf
soplex_pds

Ubuntu release version 14에서 에러가 발생하는 워크로드 (6개)

astar_river
bzip2_chicken
gcc_200
leslie3d
tonto
wrf

2. MARSS 소스 코드 분석
정섭이 형에게 소스 코드에 대한 설명을 듣기 위해, 우선 기본 MARSS 소스 코드를 읽어보았다.
올바르게 이해했는지는 모르겠지만 우선 이해한대로 써보겠다.

2.1 소스 코드 분석 방식
MARSS는 이전에도 설명한 것처럼, QEMU와 PTLsim을 붙여놓은 것이다.
소스 코드의 분석을 위해 두 가지 방식으로 접근했다.
1) MARSS가 어디에서 시작하는지 확인
2) QEMU와 PTLsim이 어떻게 연결되어 있는지 확인

1) MARSS가 어디에서 시작하는지 확인
MARSS의 main 함수는 ./qemu/vl.c에 선언되어 있다. 이 파일을 수정하고 MARSS의 바이너리(./qemu/qemu-system-x86_64)를 실행하면 출력값이 바뀌는 것을 볼 수 있다. vl.c에 선언되어 있는 main 함수를 기준으로 따라가보면 된다.

2) QEMU와 PTLsim이 어떻게 연결되어 있는지 확인
MARSS-specific한 QEMU의 코드는 Avadh Patel이 #ifdef MARSS_QEMU로 감싸두었다.
따라서 다음 명령어로 MARSS-specific한 QEMU의 코드를 확인할 수 있다.

$grep "MARSS_QEMU" ./ -ir

2.2 분석 내용
1) ./qemu/vl.c : main()
./qemu/qemu-system-x86_64를 실행하면 호출되는 함수.
실행시에 주어지는 옵션을 해석해, MARSS를 초기화한다.
초기화한 다음에 main_loop()을 호출해 emulation을 시작한다.

2) ./qemu/vl.c : main_loop()
MARSS의 핵심 루틴이다. 기본적으로 emulation을 수행하며, 사용자의 명령에 의해 simulation 모드로 넘어갈 수 있다. 사용자의 명령은 ptl_check_ptlcall_queue() 함수를 사용해 확인한다. Emulation을 하는 경우 cpu_exec_all()을 호출하며, simulation을 하는 경우에는 sim_cpu_exec()를 호출한다.

3) ./qemu/cpus.c : cpu_exec_all()
main_loop에서 emulation하는 경우 호출하며, emulation을 담당한다.

4) ./qemu/cpu-exec.c : sim_cpu_exec()
main_loop에서 simulation하는 경우 호출하며, simulation을 담당한다.
ptl_simulate()를 호출해 simulation한다.

5) ./ptlsim/sim/ptlsim.cpp : ptl_simulate()
sim_cpu_exec에서 simulation을 위해 호출한다.
ptl_simulate에서는 각종 초기화 작업을 한 다음, machine->run()으로 simulation을 시작한다.
그러면 machine은 이벤트를 등록해두고, cycle을 증가시키면서 적절한 타이밍에 trigger하는 방식으로 simulation한다.

이해가 되지 않는 점이 아주 많다.
1) 지금껏 내가 이해한 것이 맞는지.
2) cpu_exec_all()과 sim_cpu_exec()는 context 정보를 어떻게 교환하는지
3) sim_cpu_exec()에서 ptl_simulate()를 호출할 때 정보가 어떻게 넘어가나.

소스 코드를 바탕으로 한 대강의 추측 : cpu_exec_all() 함수는 CPUX86State 구조체를, sim_cpu_exec() 함수는 Context 구조체를 사용한다. Context 구조체는 CPUX86State 구조체를 상속받고 있으므로, 이 두 구조체는 혼용 가능하다. CPUX86State 구조체의 형태로 cpu_exec_all()이 조작한 다음, 그것을 그대로 sim_cpu_exec() 함수가 조작하는 것 같다.

다음 주 중으로 정섭이 형에게 코드를 인수인계받으면서, MARSS의 흐름에 대해 한 번 들어야겠다. 대강의 흐름은 잡았으니 이해하기 쉬울 것이라 기대한다.

Advertisements
Posted in 1) Memo
4 comments on “20150102
  1. […] 커널 버전에 따른 MARSS 버그 수정 2015/01/02에 MARSSx86의 SPEC CPU 2006 시뮬레이션에서 리눅스 릴리즈 버전에 따른 오류가 […]

  2. […] 제대로 실행되지 않을 수도 있을 것 같다. 에러가 발생하는 경우는 다음과 같은데, 내가 확인한 것은 Ubuntu 14의 tonto와 bzip2_chicken만 확인했기 […]

  3. […] 2015/01/02에 확인한 것과 동일하며, cacloud01에서 에러가 발생하는 것과 다르다. […]

  4. […] 2015/01/02 MARSS에 버그가 있음을 확인함. Ubuntu release version 12에서는 에러가 발생하는 워크로드가 없었음. Ubuntu release version 13에서 에러가 발생하는 워크로드 (3개) […]

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

누적 방문자 수
  • 93,229 hits
%d bloggers like this: