Hi Steve,
Your workaround solved the issue. Thanks for the quick and easy solution!
Stijn
Op 26/09/2012 17:08, Steve Reinhardt schreef:
Hi Stijn,
This is a confusing case. Based on what you're describing (and thanks
for the thorough description btw!), my hypothesis of what's happening
is that you are successfully creating a single workload SimObject, but
that that single object is getting added to the list of the CPU
object's children twice. Thus whenever the code walks the SimObject
hierarchy tree, it processes that workload object twice. That's why
you see it printed out twice in the config.ini file, and why it has
regStats() called on it twice.
I will further hypothesize that the real problem has nothing to do
with SMT or workloads, but has to do with how vector param assignment
interacts with hierarchy parent/child relationships. As you probably
already know, if you assign an unparented SimObject to a parameter
of another SimObject, the former object automatically becomes a child
of the latter one. However, if the former object already had a
parent, then it does not get reparented. This works well for scalar
parameters, and typically works OK for vector parameters where all the
objects in the assigned vector either do or do not have parents.
However, things get weird when some of the objects in the vector have
parents and some do not. I think you're finding that the problems get
weirder still when you have multiple references to the same object in
the vector, such that initially none of the objects in the vector has
a parent, but as you assign a parent to the first one then that
automatically assigns a parent to other objects.
I could rant at length about the complexity of defining consistent
semantics for vector parameter assignment (this is not the first time
it's created headaches, though this is a novel twist on the issue).
However, I think for your case, a relatively easy workaround would be
to explicitly make the workload object a child of the cpu object
before doing the assignment to the workload parameter. So doing
something like:
system.cpu[i].workload = multiprocesses[0]
system.cpu[i].workload = [ multiprocesses[0]] * int(numThreads)
might be enough.
Let me know if that works...
Steve
On Wed, Sep 26, 2012 at 4:41 AM, Stijn Eyerman
<stijn.eyer...@elis.ugent.be <mailto:stijn.eyer...@elis.ugent.be>> wrote:
Hi,
I want to simulate a multi-threaded program on a multicore
supporting SMT. I used m5threads to make some PARSEC benchmarks
run in SE mode. They run fine if I don't use SMT (i.e., one thread
per core).
To enable a multi-threaded program to run on multiple cores, the
workload of each core is set to the same process:
se.py: system.cpu[i].workload = multiprocesses[0]
This creates one workload SimObject (as seen in config.ini) as a
child of cpu0, and all cores' workloads point to that object.
To enable multiple threads on one core, I set the numThreads
parameter, and assign multiple workloads per core (which works
fine in multiprogrammed mode):
se.py: system.cpu[i].workload = [ multiprocesses[0]] * int(numThreads)
However, for two-way SMT (numThreads=2), two workload SimObjects
are created, both children of cpu0, and both with the same name.
They both refer to the same process.
config.ini:
...
[system.cpu0]
type=DerivO3CPU
children=dcache dtb fuPool icache itb tracer workload1 workload1
BTBEntries=4096
...
wbWidth=8
workload=system.cpu0.workload1 system.cpu0.workload1
dcache_port=system.cpu0.dcache.cpu_side
...
[system.cpu0.workload1]
type=LiveProcess
cmd=blackscholes 4 in_16.txt prices.txt
cwd=
...
[system.cpu0.workload1]
type=LiveProcess
cmd=blackscholes 4 in_16.txt prices.txt
cwd=
...
When this configuration is simulated, it gives an error, because
regStats() is executed twice on the same process, creating
duplicate statistics names.
When I give only one process as a workload (as in the non-SMT
case), then the second context of each core is not available for
the multi-threaded program, so that doesn't solve the problem.
It seems that everything is set correctly, except for the fact
that the workload object is now duplicated in the configuration
tree. For the simulation itself, both thread contexts point to the
same process, which is correct. But when the statistics are
initialized, it goes over this process twice, which causes the error.
How can I eliminate this duplication?
And how is it done in the non-SMT mode? In that case, the same
process is assigned to multiple cores, but still only one workload
object is created. Is it checked somewhere that workloads could be
the same and that only one object is created? Then maybe it
doesn't check this if multiple processes to one CPU are assigned?
I've tried to dig into the configuration tree creation code, but
this is quite hard to understand due to the mixture of Python and C++.
Does anyone have an idea?
Thanks,
Stijn
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org <mailto:gem5-users@gem5.org>
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users