Hi Everyone,

I'm setting M5 up for a research project, and I'm having issues with  
sampling. I would like to be able to switch back and forth between  
TimingSimpleCPU and AtomicSimpleCPU on command. My simulation script  
is included at the end. I can switch from timing to atomic with no  
problem, but after switching back to timing, nothing happens (tracing  
the bus confirms that there is no activity). If I switch back to  
atomic (using the script), bus activity resumes and simulation  
continues. I am running on Ubuntu (2.6.27-9 kernel, gcc 4.3.2) using  
the ALPHA_FS target.

Please advise!
Thanks!
-David

Here is sample output:
$ build/ALPHA_FS/m5.opt dmp.py
M5 Simulator System

Copyright (c) 2001-2008
The Regents of The University of Michigan
All Rights Reserved


M5 compiled Dec 27 2008 05:42:19
M5 revision 5780:50c9d48de3caa629a27408bf5f3423656ae15da1
M5 commit date Wed Dec 17 09:51:18 2008 -0800
M5 started Dec 29 2008 20:46:14
M5 executing on calvin.eecs.umich.edu
command line: build/ALPHA_FS/m5.opt dmp.py
Global frequency set at 1000000000000 ticks per second
warn: kernel located at: /n/poolfs/z/dist/m5/system/binaries/vmlinux
Listening for system connection on port 3456
       0: switch_cpus.system.tsunami.io.rtc: Real-time clock set to  
Thu Jan  1 00:00:00 2009
0: switch_cpus.system.remote_gdb.listener: listening for remote gdb #0  
on port 7000
**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
651374031000: switch_cpus.system.terminal: attach terminal 0
warn: be nice to actually delete the event here
Simulator exited @ 4116076212000. Cause: checkpoint
info: Entering event queue @ 4116076212000.  Starting simulation...
info: Entering event queue @ 4116076242000.  Starting simulation...
Changing memory mode to atomic
switching cpus
info: Entering event queue @ 4116076244000.  Starting simulation...
Simulator exited @ 4116426040000. Cause: checkpoint
Changing memory mode to timing
switching cpus
info: Entering event queue @ 4116426040000.  Starting simulation...
[never continues past this point]

---------------------------------------------------------------------------------------------------------

Sample terminal output:
[... Linux booting]
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 224k freed
init started:  BusyBox v1.1.0 (2007.03.04-01:07+0000) multi-call binary
mounting filesystems...
EXT2-fs warning: checktime reached, running e2fsck is recommended
loading script...
[never continues past this point]

---------------------------------------------------------------------------------------------------------

Command-line script:
m5 checkpoint
m5 checkpoint
[never continues past this point]
ls
bash

---------------------------------------------------------------------------------------------------------

Python script:
import optparse, os, sys

import m5

if not m5.build_env['FULL_SYSTEM']:
     m5.panic("This script requires full-system mode (*_FS).")

from os import getcwd
from m5.objects import *
m5.AddToPath('configs/common')
from FSConfig import *
from SysPaths import *
from Benchmarks import *
import Simulation
from Caches import *
from os.path import isdir, exists
from os import listdir
import re

def switchList(num_cpus, system, current_cpus, switchType):
     if current_cpus == None:
         deferReg = False
         sys = Parent.any
     else:
         deferReg = True
         sys = system
     if switchType == 'atomic':
         switchType = AtomicSimpleCPU
     elif switchType == 'timing':
         switchType = TimingSimpleCPU
     elif switchType == 'o3':
         switchType = DerivO3CPU
     else:
         raise TypeError, "Invalid CPU type."
     switch_cpus =  
[switchType(cpu_id=i,defer_registration=deferReg,system=sys) \
                    for i in xrange(num_cpus)]
     return switch_cpus

# Get paths we might need.  It's expected this file is in m5/configs/ 
example.
config_path = os.path.dirname(os.path.abspath(__file__))
config_root = config_path+"/configs";

parser = optparse.OptionParser()

execfile(os.path.join(config_root, "common", "Options.py"))

(options, args) = parser.parse_args()

if args:
     print "Error: script doesn't take any positional arguments"
     sys.exit(1)

# checkpoint directory
cptdir = getcwd()

# Run options
num_cpus = 1
cpt_num = 1

TimingSimpleCPU.clock = '2GHz'

bm = [SysConfig()]
sys = makeLinuxAlphaSystem('timing', bm[0])
sys.kernel = binary("vmlinux")
sys.readfile = "dmp.sh"

detailed_cpus = checkpoint_cpus = []
detailed_cpus = switchList(num_cpus, sys, None, 'timing')
checkpoint_cpus = switchList(num_cpus, sys, detailed_cpus, 'atomic')

switch_cpu_list = [(detailed_cpus[i], checkpoint_cpus[i]) \
                    for i in xrange(num_cpus)]

sys.cpu = detailed_cpus

for i in xrange(num_cpus):
     sys.cpu[i].connectMemPorts(sys.membus)
     checkpoint_cpus[i].clock = sys.cpu[0].clock

root = Root(system=sys)
root.switch_cpus = checkpoint_cpus

m5.instantiate(root)

print "**** REAL SIMULATION ****"

while True:
     exit_event = m5.simulate()
     print "Simulator exited @ %d. Cause: %s" % (m5.curTick(),  
exit_event.getCause())
     if exit_event.getCause() == "user interrupt received" or \
        exit_event.getCause() == "m5_exit instruction encountered":
         break
     elif exit_event.getCause() == "checkpoint":
         if sys.getMemoryMode() == m5.objects.params.atomic:
             for i in xrange(num_cpus):
                 m5.doDrain(checkpoint_cpus[i])
             m5.changeToTiming(sys)
             m5.switchCpus(switch_cpu_list)
             m5.resume(sys)
             checkpoint_cpus = switchList(num_cpus, sys,  
detailed_cpus, 'atomic')
             root.switch_cpus = checkpoint_cpus
             for i in xrange(num_cpus):
                 root.switch_cpus[i].getCCObject() # initialize SWIG  
object
             switch_cpu_list = [(detailed_cpus[i], checkpoint_cpus[i]) \
                                for i in xrange(num_cpus)]
         else:
             for i in xrange(num_cpus):
                 m5.doDrain(detailed_cpus[i])
             m5.changeToAtomic(sys)
             m5.switchCpus(switch_cpu_list)
             m5.resume(sys)
             detailed_cpus = switchList(num_cpus, sys,  
checkpoint_cpus, 'timing')
             root.switch_cpus = detailed_cpus
             for i in xrange(num_cpus):
                 root.switch_cpus[i].getCCObject() # initialize SWIG  
object
             switch_cpu_list = [(checkpoint_cpus[i], detailed_cpus[i]) \
                                for i in xrange(num_cpus)]


_______________________________________________
m5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users

Reply via email to