On 10/06/10 18:06, Henrique Ferreiro wrote:
Hi!

I manage to make it work with one capability. That is, now the CCCS is
stored per capability but I can't enable parallel profiling because
the stacks are still shared.

Now I wanted to have one instance of each stack and cost centre per
capability, so that I can track the behaviour of each capability
independently. Doing that is easy in the runtime system but I found
out that I also have to change the code generator in the same way. I
need "emitCostCentreDecl" and "costCentreStackDecl" to declare an
array of structs instead of a single struct. Can someone help me with
this?

Do you really need to do this? Why not share the stacks and use a mutex to protect the operations?

Cheers,
        Simon


2010/6/4 Henrique Ferreiro<hferre...@udc.es>:
Hi again!

I need some help with this.

2010/3/17 Simon Marlow<marlo...@gmail.com>:
On 16/03/2010 19:34, Henrique Ferreiro wrote:

Hello!

I am trying to make cost centre profiling work in the threaded rts
build in order to use that information to better understand parallel
behaviour.

Currently I am learning about the internals of GHC and I am thinking
about how this could be done. The main blocker is that the current
cost centre stack is a shared global variable. The simplest solution I
came up with is to convert it to a thread local variable. The problem
would be how to access it from the global timer.

Yes, basically what you want to do is put CCCS into the StgRegs structure,
which will make it thread-local.  In the timer signal you want to bump the
counters for the CCCS on each Capability - so just iterate through the array
of Capabilities and bump each one.

I tried adding a new register CCCS to StgRegTable in stg/Regs.h but
there is too much hidden knowledge in the code and it isn't working.

I got to the point where I have changed every reference to the global
variable to this register. The problem is that it isn't getting
updated. Debugging a bit it seems that the register is used as it
should (the calls to PushCostCentre and AppendCCS from the generated
code use the correct value in CCCS) but it isn't getting stored in the
register table because every time the timer is called, the value
stored is CCS_SYSTEM, the one used in initialization.

I tried to mimic how the other registers are implemented but there is
no documentation at all so I wasn't sure what was exactly required.

Could someone tell where exactly I have to change things or should I
post my changes and ask about specific details?


_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to