This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: autopar reduction and OMP_ATOMIC gimplify/expand changes - final patch
- From: Razya Ladelsky <RAZYA at il dot ibm dot com>
- To: Zdenek Dvorak <rakdver at kam dot mff dot cuni dot cz>
- Cc: Diego Novillo <dnovillo at google dot com>, gcc-patches at gcc dot gnu dot org
- Date: Wed, 31 Oct 2007 15:24:38 +0200
- Subject: Re: autopar reduction and OMP_ATOMIC gimplify/expand changes - final patch
Zdenek Dvorak <rakdver@kam.mff.cuni.cz> wrote on 31/10/2007 14:08:43:
> Hi,
>
> looking at the example, there seem to be two problems with the
> transformation:
>
> > after reduction transformation (only relevant parts):
> >
> > parloop
> > {
> >
> > ....
> >
> > # Two new variables are created for each reduction:
> > "reduction" is the variable holding the neutral element for the
> > particular operation, e.g. 0 for PLUS_EXPR, 1 for MULT_EXPR, etc.
> > "reduction_initial" is the initial value given by the user.
> > It is kept and will be used after the parallel computing is done. #
> >
> > reduction_initial.24_46 = 1;
> > reduction.23_45 = 0;
> > .paral_data_store.32.reduction.23 = reduction.23_45;
> >
> > #pragma omp parallel num_threads(4)
> > reduction.28_48 = .paral_data_load.33_51->reduction.23;
>
> You cannot do this -- another thread could have already altered the
> value of reduction.23. You need a separate variable holding the initial
> value of reduction.28_48 (or preferably, as this initial value is always
> a constant, just put the constant here directly).
Very true.
Thanks for noticing.
I'll send the patch to fix it.
>
> > #pragma omp for schedule(static)
> > # sum.27_29 = PHI <sum.27_11, reduction.28_48>
> > sum.27_11 = D.1827_8 + sum.27_29;
> > OMP_CONTINUE
> >
> > # Adding this reduction phi is done at create_phi_for_local_result()
#
> > # reduction.23_58 = PHI <sum.27_11(5), 0(23)>
> > OMP_RETURN
> >
> > # Creating the atomic operation is done at
> > create_call_for_reduction_1() #
> >
> > #pragma omp atomic_load
> > D.1839_59 = *&.paral_data_load.33_51->reduction.23;
> > D.1840_60 = reduction.23_58 + D.1839_59;
> > #pragma omp atomic_store (D.1840_60);
> >
> > OMP_RETURN
> >
> > # collecting the result after the join of the threads is done at
> > create_loads_for_reductions().
> > a new variable "reduction_final" is created. It calculates the
final
> > value from the initial value and the value computed by the threads #
> >
> > reduction_final.34_53 = .paral_data_load.33_52->reduction.23;
> > sum_37 = reduction_initial.24_46 + reduction_final.34_53;
> > sum_43 = D.1795_41 + sum_37;
>
> There seems to be another error -- paral_data_load is no longer
accessible
> at this point; you need to load the value from paral_data_store.
>
Actually the complete code is:
.paral_data_load.33_52 = &.paral_data_store.32;
reduction_final.34_53 = .paral_data_load.33_52->reduction.23;
sum_37 = reduction_initial.24_46 + reduction_final.34_53;
So .paral_data_load.33_52 is initialized with .paral_data_store.32
Ok?
> Zdenek