gem5의 거의 모든 객체는 SimObject로 부터 상속된다. SimObject는 모든 객체에 대해 기본 인터페이스를 제공한다. SimObject는 Python에서 Access가능하도록한 Wrapped 된 C++ 객체들이다.
SimObject는 Python Config를 통해 설정되는 많은 매개 변수들을 가질 수 있다.
이 글에서는 간단한 "HelloWorld" SimObject를 만드는 과정을 설명한다.
1. 새로운 SimObjec를 위한 Python Class 생성
각 SimObject에게는 연관된 Python Class가 존재한다. 이 Python Class는 Config에서 제어할 수 있는 SimObject의 Paramter를 설명한다.
해당 SimObject의 경우 Parameter 없이 시작하겠다. 따라서 SimObject에 대한 새 Class를 선언하고 SimObject에 대한 C++ Class를 정의 할 이름과 C++ 헤더를 설정하기만 하면 된다.
src/learning_gem5/part2 에서 HelloObject.py를 찾을 수 있다.
from m5.params import *
from m5.SimObject import SimObject
class HelloObject(SimObject):
type = 'HelloObject'
cxx_header = "learning_gem5/part2/hello_object.hh"
type이 Class 명과 동일할 필요는 없지만 관례적으로 사용된다. type은 SimObject를 위해 Wrapped된 C++ Class 명과 동일해야한다.
cxx_header 는 사용되는 클래서의 선언부분이 들어있는 파일을 정의해야한다.
2. C++에서 SimObject 구현
src/learning_gem5/part2 에서및 hello_object.hh 및 hello_object.cc를 찾을 수 있다.
C++ 객체의 header 파일부터 시작한다. HelloObject는 SimObject로 부터 상속을 해야한다.
SimObject Class는 많은 virtual func을 지원한다. 그러나 이러한 Func은 순수한 virtual이 아니므로 가장 간단한 경우 생성자를 제외한 모든 함수르 구현할 필요가 없다.
모든 SimObject의 생성자는 Parameter 객체를 취할 것이라 가정한다. 이 Parameter 객체는 빌드 시스템에 의해 자동으로 생성되며 SimObject를 위한 Python class의 기반이 된다. 이는 위에서 생성한 것과 같은 SimObject의 Class를 기반으로 한다. type은 HelloObjectParams 이다.
#ifndef __LEARNING_GEM5_HELLO_OBJECT_HH__
#define __LEARNING_GEM5_HELLO_OBJECT_HH__
#include "params/HelloObject.hh"
#include "sim/sim_object.hh"
class HelloObject : public SimObject
{
public:
HelloObject(HelloObjectParams *p);
};
#endif // __LEARNING_GEM5_HELLO_OBJECT_HH__
다음으로 .cc 파일에서 두개의 함수를 구현해야 한다. 첫번째 함수는 HelloObject 즉 생성자 이다.
이는 단순히 Parameter 객체를 부모인 SimObject 객체에 전달하고 Hello World를 출력한다.
일반적으로 gem5에서 std::out은 절대적으로 허용하지 않는다. 대신 Debug flag를 사용해야한다. 이는 다음 장에서 설명한다. 지금은 간단하게 구현하기위해 사용한다.
#include "learning_gem5/part2/hello_object.hh"
#include <iostream>
HelloObject::HelloObject(HelloObjectParams *params) :
SimObject(params)
{
std::cout << "Hello World! From a SimObject!" << std::endl;
}
SimObject를 완성하기 위해서 두번째 함수를 추가해야한다. SimObject Python Declaration에서 암시 적으로 생성 된 매개 변수 유형에 대해 하나의 함수, 즉 create 함수를 구현해야한다. 해당 함수는 간단하게 SimObject를 return한다.
HelloObject*
HelloObjectParams::create()
{
return new HelloObject(this);
}
만약 create 함수를 추가하지 않은경우 컴파일때 링커 오류가 발생하게 된다.
3. SimObject 및 C++ 파일 등록
C++파일을 컴파일하고 Python을 인터프리터에게 알리기 위해 이 파일에 대한 빌드 시스템을 등록해야한다. gem5는 빌드 시스템으로 scons를 사용하므로 SimObject에 대한 코드가 있는 디렉토리에 SConscipt를 생성하기만 하면 된다. 이미 파일이 존재한다면 Declaration만 하면 된다.
Import('*')
SimObject('HelloObject.py')
Source('hello_object.cc')
4. gem5 Rebuild
새 파일을 추가하고 컴파일, 링크를 하려면 gem5를 재컴파일 하면된다. 이번 예제는 X86을 사용하고 있다고 한다.
scons build/X86/gem5.opt
5. New SimObject를 사용하기위한 Config 생성
SimObject를 사용하고 인스턴스화 하려면 Python Config 파일을 생성해야한다. 객체가 매우 단순하기 때문에 System의 주요한 객체들이 필요하지 않다. 파일은 configs/learning_gem5/part2/run_hello.py 에서 찾아 볼 수있다.
import m5
from m5.objects import *
root = Root(full_system = False)
root.hello = HelloObject()
HelloObject를 인스턴스화 할 수 있다. 해야하는 것은 Python 생성자를 실행하는것 뿐이다.
객체의 인스턴스화를 만드는 것 외에도 Root 객체의 자식인지 확인해야한다. Root 객체의 자식 SimObject 만 C++에서 인스턴스화됩니다.
m5.instantiate()
print("Beginning simulation!")
exit_event = m5.simulate()
print('Exiting @ tick {} because {}'
.format(m5.curTick(), exit_event.getCause()))
그리고 instantiate() 및 simulate()를 호출 하면된다.
'LAB > GEM5' 카테고리의 다른 글
GEM5, NVMain 설치 (0) | 2021.03.16 |
---|---|
GEM5에 L3 Cache 추가 (0) | 2021.03.13 |
GEM5 Tutorial 5 - se.py 및 fs.py 구성 (0) | 2021.03.05 |
GEM5 Tutorial 4 - 제공되는 Default Config (0) | 2021.03.04 |
GEM5 Tutorial 3 - gem5 결과 분석용 파일 (0) | 2021.03.04 |