It's not obvious to me how to easily emulate a software thread migration
purely inside the simulator.  Since the application is triggering the
thread migration anyway, why not do it all in software?

Steve

On Tue, Oct 14, 2014 at 7:11 AM, Sanem Arslan <sanem.ars...@boun.edu.tr>
wrote:

> Hi Steve,
>
> First of all thank you very much for your response.
> I will do thread migration multiple times and this method has performance
> overhead due to high drain cycles.
>
> AFAIK, this method is to migrate hardware threads. Actually, I want to
> migrate software threads rather than hardware threads. Is there a way to
> migrate software threads from simulation side?
>
> Thanks.
> Sanem.
>
> Steve Reinhardt <ste...@gmail.com>
>
>
>  The error you're seeing in your second email is precisely because you're
>> no
>> longer using drain().  Basically you're in trouble if you switch CPUs
>> while
>> there's a cache miss outstanding, because then the cache miss response
>> will
>> come back to the wrong (old) CPU.  The point of drain() is to put the
>> system in a stable state where you don't have outstanding activity.
>>
>> Calling drain() actually initiates an iterative process that takes
>> multiple
>> cycles to complete, so you can't initiate and complete a drain within a
>> single instruction.  Look at the python drain() method in simulate.py.
>> Somehow you have to stall in the instruction and get back to the event
>> loop
>> to complete the drain process.
>>
>> Steve
>>
>> On Sat, Sep 20, 2014 at 7:38 AM, sanem.arslan via gem5-users <
>> gem5-users@gem5.org> wrote:
>>
>>  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
>>>
>>
>>
>
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to