Hello again,

I give up to use drain() and switchOut() functions since I only seek for migrate anapplication thread from one core to another without any change on cpu type. So I updated my pseudo-instruction like that:

void
my_func(ThreadContext *tc)
{
 BaseCPU *oldcpu = tc->getCpuPtr();
 System *sys = tc->getSystemPtr();
ThreadContext *other_tc = sys->threadContexts[0]; //migrate from calling cpu to cpu0.
 BaseCPU *newcpu = other_tc->getCpuPtr();

 tc->suspend();
 other_tc->takeOverFrom(tc);
 CpuEvent::replaceThreadContext(tc, other_tc);
 assert(other_tc->contextId() == tc->contextId());
 assert(other_tc->threadId() == tc->threadId());
 sys->replaceThreadContext(other_tc, other_tc->contextId());

 other_tc->pcState(other_tc->nextInstAddr());

}

However I get the following error now:

Error:
TimingSimpleCPU::activateContext  _status 9  Idle 0 cpu id 0
gem5.opt: build/ALPHA/cpu/simple/timing.cc:213: virtual void TimingSimpleCPU::activateContext(ThreadID, Cycles): Assertion `_status == Idle' failed.
Program aborted at cycle 2421875000000
Aborted (core dumped)

This error is about the receiver cpu (cpu0) cannot activate its migrated thread (other_tc) because of its status (status 9: DcacheWaitResponse) ?

I cannot solve my problem. Is there really anyone who can help me about that?

Bests,
Sanem.


2014-09-18 14:48, sanem.arslan yazmış:
Hello,

I am working on migrating application threads from one core to
another on gem5. I have implemented a pseudo-instruction to trigger
thread migration. When an application thread calls this
pseudo-instruction, I want to migrate the thread to another cpu. My
problem is that I cannot migrate application threads from simulator
side by using _pthread_ library. So I need to migrate all thread
context in simulator side.

According to this [1] presentation on gem5 web site, I should use _
drain, switchOut, takeOverFrom_ and _resume_ functions of gem5.
However I do not know how to use them inside the pseudo-instruction.
If you have studied on this issue before, could you please inform me
about how to migrate threads step by step from simuator side?

I put the codes inside my pseudo-instruction. Without using
_drainResume_() function, the system hangs. With using drainResume()
function, it gives cpu status error.

void
my_func(ThreadContext *tc)
{

 BaseCPU *oldcpu = tc->getCpuPtr();
 System *sys = tc->getSystemPtr();
 ThreadContext *other_tc = sys->threadContexts[0]; //migrate from
calling cpu to cpu0.
 BaseCPU *newcpu = other_tc->getCpuPtr();
 oldcpu->drain(NULL);
 oldcpu->switchOut();

 tc->suspend();
 other_tc->takeOverFrom(tc);

 //timing cpu does not have resume function, instead it has
drainResume() function. //newcpu->drainResume();
}

Thank you in advance for your time and help.

Best Regards,
Sanem



Links:
------
[1] http://www.m5sim.org/wiki/images/d/da/Gutierrez_gem5_workshop_2012.pdf
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to