Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A...

41
Learning gem5 – Part II Modifying and Extending gem5 Jason Lowe-Power http://learning.gem5.org/ https://faculty.engineering.ucdavis.edu/lowepower/ © Jason Lowe-Power <[email protected]> 1

Transcript of Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A...

Page 1: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Learning gem5 – Part IIModifying and Extending gem5

Jason Lowe-Powerhttp://learning.gem5.org/

https://faculty.engineering.ucdavis.edu/lowepower/

© Jason Lowe-Power <[email protected]> 1

Page 2: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

A simple SimObjecthttp://learning.gem5.org/book/part2/helloobject.html

© Jason Lowe-Power <[email protected]> 2

Page 3: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

gem5’s coding guidelines

Follow the style guide (http://www.gem5.org/Coding_Style)

Install the style guide when scons asks

Don’t ignore style errors

Use good development practices

Historically mercurial queues

Now: git branches

© Jason Lowe-Power <[email protected]> 3

Page 4: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Adding a new SimObject

Step 1: Create a Python class

Step 2: Implement the C++

Step 3: Register the SimObject and C++ file

Step 4: (Re-)build gem5

Step 5: Create a config script

© Jason Lowe-Power <[email protected]> 4

Switch!

Page 5: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 1: Create a Python class

© Jason Lowe-Power <[email protected]> 5

| from m5.params import *| from m5.SimObject import SimObject|| class HelloObject(SimObject):| type = ‘HelloObject’| cxx_header = ‘learning_gem5/hello_object.hh’

Import the objects we need

m5.params: Things like MemorySize, Int, etc.

type: The C++ class name cxx_header: The filename for the C++ header file

HelloObject.py

Page 6: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 2: Implement the C++

© Jason Lowe-Power <[email protected]> 6

| #include "params/HelloObject.hh"

| #include "sim/sim_object.hh"

| class HelloObject : public SimObject

| {

| public:

| HelloObject(HelloObjectParams *p);

| };

hello_object.hh params/*.hh generated automatically. Comes from Python SimObject definition

Constructor has one parameter, the generated params object.

Page 7: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 2: Implement the C++

© Jason Lowe-Power <[email protected]> 7

HelloObject::HelloObject(HelloObjectParams *params)

: SimObject(params)

{

std::cout << "Hello World! From a SimObject!" << std::endl;

}

HelloObject*

HelloObjectParams::create()

{

return new HelloObject(this);

}

hello_object.cc

HelloObjectParams: when you specify a Param in the Hello.py file, it will be a member of this object.

You must define this function (you’ll get a linker error otherwise). This is how Python config creates the C++ object.

Page 8: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 3: Register the SimObject and C++ file

© Jason Lowe-Power <[email protected]> 8

| Import(*)

| SimObject(‘Hello.py’)

| Source(‘hello_object.cc’)

SConscript Import: SConscript is just Python… but weird.

SimObject(): Says that this Python file contains a SimObject. Note: you can put pretty much any Python in here

Source(): Tell scons to compile this file (e.g., with g++).

Page 9: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 4: (Re-)build gem5

© Jason Lowe-Power <[email protected]> 9

Page 10: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Step 5: Create a config script

© Jason Lowe-Power <[email protected]> 10

| ...

| system.hello = HelloObject()

| ...

Instantiate the new object that you created in the config file (e.g., simple.py)

> build/X86/gem5.opt configs/learning_gem5/hello.py

...

Hello world! From a SimObject!

...

Page 11: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Simple SimObject code

gem5/src/learning_gem5/part2/hello_object.cc

gem5/src/learning_gem5/part2/hello_object.hh

gem5/src/learning_gem5/part2/HelloObject.py

gem5/configs/learning_gem5/part2/hello_run.py

© Jason Lowe-Power <[email protected]> 11

Page 12: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Debug support in gem5http://learning.gem5.org/book/part2/debugging.html

© Jason Lowe-Power <[email protected]> 12

Page 13: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Adding debug flags

© Jason Lowe-Power <[email protected]> 13

Switch!DebugFlag(‘Hello’)

DPRINTF(Hello, “Created the hello object”);

Declare the flag: add the debug flag to the SConscriptfile in the current directory

DPRINTF: macro for debug statements in gem5

Hello: the debug flag declared in the SConscript.Found in “debug/hello.hh”

Debug string: Any C format string

SConscript

hello_object.cc

Page 14: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Debugging gem5

© Jason Lowe-Power <[email protected]> 14

> build/X86/gem5.opt --debug-flags=Hello configs/tutorial/hello.py

...

0: system.hello: Hello world! From a debug statement

debug-flags: Comma separated list of flags to enable. Other options include --debug-start=<tick>, --debug-ignore=<simobj name>,etc. See gem5.opt --help

Page 15: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Event-driven programminghttp://learning.gem5.org/book/part2/events.html

© Jason Lowe-Power <[email protected]> 15

Page 16: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Simple event callback

© Jason Lowe-Power <[email protected]> 16

Switch!| class HelloObject : public SimObject

| {

| private:

| ...

| void processEvent();

| EventFunctionWrapper event;

|

| public:

| HelloObject(HelloObjectParams *p);

| void startup();

| };

EventFunctionWrapper: Convenience class for simple events.

processEvent: Callback function to run when event fires.

startup: Called after all SimObjects instantiated. Schedule local events here.

Page 17: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Simple event callback

© Jason Lowe-Power <[email protected]> 17

| void

| HelloObject::processEvent()

| {

| timesLeft--;

| DPRINTF(Hello, "Hello world!"

| " Processing the event! %d left\n", timesLeft);

| if (timesLeft <= 0) {

| DPRINTF(Hello, "Done firing!\n");

| } else {

| schedule(event, curTick() + latency);

| }

| }

schedule: Put an event instance on the event queue. An absolute tick used for when the event is processed.

curTick: Returns the current simulator time. Useful for relative time computations.

Page 18: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Event SimObject code

http://learning.gem5.org/book/_downloads/hello_object1.hh

http://learning.gem5.org/book/_downloads/hello_object2.cc

© Jason Lowe-Power <[email protected]> 18

Page 19: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

SimObject parametershttp://learning.gem5.org/book/part2/parameters.html

© Jason Lowe-Power <[email protected]> 19

Page 20: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Switch!

Adding parameters

© Jason Lowe-Power <[email protected]> 20

| class HelloObject(SimObject):| type = 'HelloObject'| cxx_header = "learning_gem5/hello_object.hh"|| time_to_wait = Param.Latency("Time before firing the event")| number_of_fires = Param.Int(1, "Number of times to fire the event before "| "goodbye")

Param.<TYPE>: Specifies a parameter of type <TYPE> for the SimObject

Param.<TYPE>(): First parameter: default value.Second parameter: “help”

Page 21: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Going further: More parameters

Included types (e.g., MemorySize, MemoryBandwidth, Latency)

Using a SimObject as a parameter

SimObject-SimObject interaction

src/learning_gem5/part2/hello_object.cc & hello_object.hh

src/learning_gem5/part2/goodbye_object.cc & goodbye_object.hh

src/learning_gem5/part2/HelloObject.py & GoodbyeObject.py

© Jason Lowe-Power <[email protected]> 21

http://learning.gem5.org/book/part2/parameters.html

Page 22: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Questions?

We covered

How to build a SimObject

How to schedule events

Debug statements in gem5

Adding parameters to SimObjects

© Jason Lowe-Power <[email protected]> 22

Page 23: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

MemObjectshttp://learning.gem5.org/book/part2/memoryobject.html

© Jason Lowe-Power <[email protected]> 23

Page 24: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

MemObject

Object that is part of gem5’s memory system

both classic caches and Ruby are MemObjects

Allowed to have MasterPorts and SlavePorts

© Jason Lowe-Power <[email protected]> 24

Page 25: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Packets

Unit of transfer between MemObjects

Packets pass between Master and Slave ports

Packets haveRequestCommandDataMuch more…

© Jason Lowe-Power <[email protected]> 25

Page 26: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Master and slave ports

© Jason Lowe-Power <[email protected]> 26

Master Slave

sendTimingReq recvTimingReq

returns: true Slave executesrequest

Time

sendTimingReq: send a Packet containing a request from a master to a slave

recvTimingReq: function that is called to handle the request in the slave port.

return true: The slave can handle the request.

Page 27: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Master and slave ports

© Jason Lowe-Power <[email protected]> 27

Master Slave

sendTimingReq recvTimingReq

returns: true

returns: true

Slave executesrequest

recvTimingResp sendTimingResp

Time

sendTimingResp: The slave finishes processing the request, and now sends a response (same packet).

recvTimingResp: Handles the response from the slave. Returning true means the packet is handled.

Page 28: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Master and slave ports

© Jason Lowe-Power <[email protected]> 28

Master Slave

sendTimingReq recvTimingReq

returns: falseSlave busyTim

e

sendTimingReq recvTimingReq

returns: true

recvReqRetry sendReqRetry

return false: Slave cannot currently process the Packet. Resend the packet later. The Master’sresponsibility to track Packet.

sendReqRetry: Tell the master it can retry the stalled Packet.

recvReqRetry: Can now retry the request by calling sendTimingReq.

Page 29: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Master and slave ports

© Jason Lowe-Power <[email protected]> 29

Master Slave

returns: false

recvTimingResp sendTimingResp

return false: Master cannot currently process the Packet. Resend the packet later. The Slave’sresponsibility to track Packet.

returns: true

recvTimingResp sendTimingResp

sendRespRetry recvRespRetry

sendRespRetry: Slave can now retry the response.

Page 30: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Master and slave port interface

Masterrecv Timing Resp

recv Req Retry

recv Range Change

Slaverecv Timing Req

recv Resp Retry

recv Functional

get Addr Ranges

© Jason Lowe-Power <[email protected]> 30

Page 31: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Simple MemObject

© Jason Lowe-Power <[email protected]> 31

Switch!

Page 32: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Overview of SimpleMemobj© Jason Lowe-Power <[email protected]> 32

Page 33: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

SimpleCachehttp://learning.gem5.org/book/part2/simplecache.html

© Jason Lowe-Power <[email protected]> 33

Page 34: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Cache: A first “real” object

How to model…

Data storage

Tags

Associativity

Data access latency

Blocking?

© Jason Lowe-Power <[email protected]> 34

std::map

Make an event

Could implement MSHRS…

Page 35: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Design

Handle request -> accessTiming with a delayAccessTiming

->accessFuntional to check for hit/miss->if hit, reply->if miss, upgrade request and send read

Handle response-> insert new data (evict if needed)-> accessFunctional to read/write-> reply

© Jason Lowe-Power <[email protected]> 35

Switch!

Page 36: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

More on events

schedule(new EventFunctionWrapper(

[this, pkt] { accessTiming(pkt); },

name() + ".accessEvent",

true),

clockEdge(latency));

© Jason Lowe-Power <[email protected]> 36

Anonymous function to executeLocal variables to

“capture”

Delete this object after executing event

Page 37: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Packet construction

Many different packet constructorsSee src/mem/packet.hh for details

Packet(Request, command)

Packet(Request, command, block size)Make a packet that is block aligned (overrides request address)

createRead/createWrite(Request)Should probably use these convenience functions

© Jason Lowe-Power <[email protected]> 37

Page 38: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Packets data allocation

Dynamic data: Will be deleted when the packet is deleted

packet->allocate(): Allocates dynamic data

Static data: Give packet a pointer to the data. It will not delete it.

SenderState: Can be used to store “local” information

© Jason Lowe-Power <[email protected]> 38

Page 39: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Packets: To delete or not to delete

Do not delete to send a response

Call packet->makeResponse()

Do delete if you are the final sink for the packet

E.g., a memory write

Do delete if you initiated the request and then received the response

© Jason Lowe-Power <[email protected]> 39

Page 40: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Complete code available

Statistics

Better flow control

Code to make it work with O3CPU

Much more: http://learning.gem5.org/book/part2/simplecache.html

© Jason Lowe-Power <[email protected]> 40

Page 41: Learning gem5 Part IIlearning.gem5.org/tutorial/presentations/learning gem5... · 2018-09-17 · A simple SimObject  © Jason Lowe-Power  2

Questions?

We covered

How to make a MemObject

gem5 packets

The master – slave API in gem5

“Real” cache example

© Jason Lowe-Power <[email protected]> 41