Hi

On 06/24, nick wrote:
> 
> 
> On 2019-06-24 8:59 a.m., Giuliano Belinassi wrote:
> > Hi,
> > 
> > Parallelize GCC with Threads -- First Evaluation
> > 
> > Hi everyone,
> > 
> > I am attaching the first evaluation report here publicly for gathering
> > feedback. The file is in markdown format and it can be easily be converted 
> > to
> > PDF for better visualization.
> > 
> > I am also open to suggestions and ideas in order to improve the current 
> > project :-)
> > 
> > My branch can be seen here: 
> > https://gitlab.com/flusp/gcc/tree/giulianob_parallel
> > 
> > Giuliano
> > 
> 
> Guiliano,
> 
> Three things first your original proposal was just for expand_all_functions 
> so don't
> know if it's extended out now but there's other parts in my research so the 
> title
> was a little confusing.

Everything that I am doing is to parallelize this function. Notice that
in trunk there is a call to node->expand(), and in order to expand two
nodes in parallel I have to explore all shared states inside these,
including the passes. Also my work until now is focused in GIMPLE.

> 
> I'm assuming this is outside the scope of the current project but does your 
> all_rtl_passes
> function help out with architecture specific tuning flags as it seems that my 
> research
> states that's one area of shared state.

Sorry, but I am not sure if I understeand what you meant. When splitting
all_passes into all_passes and all_rtl_passes, I didn't touch it and I
am assuming it is working as all tests except three which I told Richard
are passing. As for tuning flags, I documented a few of then but I am
currently ignoring it since I marked it as backend dependency.

> 
> In addition for memory this may be really hard to do but can you have a 
> signaler 
> that tells each phase what  data to pass on therefore notifying what needs to 
> be
> passed on to the next pass. So if expand_all_functions needs to pass x the 
> signaler
> will notify the pass and just swap the values into the pass lock less if 
> possible
> or just kill it off if not. This would mean writing a GENERIC to RTL final 
> passes
> signaler which may take too long considering the scope of the project.

I am assuming you are talking about the pass-pipeline approach Richi
recommended to avoid the per-pass global-states. I don't think a signal
is a good idea here as we can lose signals around if we are not careful
enough. What I would do is to use a producer-consumer queue on each
pass, passing the function to optimize and a struct whith everything the
pass needs. Or protect the global states with a binary semaphore: when the
pass is running, it decrements the semaphore, and increments it after it
works is done. When the previous pass wants to send information, I
decrement the semaphore, change the variables, and increment it again.
This is pretty similar of how a mutex work.

> 
> Again that's just off the top of my head so it may be a really bad idea,
> 
> Nick 
> 
> P.S. Good luck through.
Thank you,
Giuliano

Reply via email to