This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH GCC][4/5]Improve loop distribution to handle hmmer


On Thu, Jun 8, 2017 at 3:48 AM, kugan <kugan.vivekanandarajah@linaro.org> wrote:
> Hi Bin,
>
>> +
>> +/* In reduced dependence graph RDG for loop distribution, return true if
>> +   dependence between references DR1 and DR2 may create dependence cycle
>> +   and such dependence cycle can't be resolved by runtime alias check.
>> */
>> +
>> +static bool
>> +possible_data_dep_cycle_p (struct graph *rdg,
>> +                          hash_table<ddr_entry_hasher> *ddr_table,
>> +                          data_reference_p dr1, data_reference_p dr2)
>
>
> This name seems to be misleading a bit. It is basically dependence test ? Of
> course this can lead to a cycle but looks like possible_data_dep_p would be
> better.
This tests dependence between statements in one partition.  It
indicates a must dependence cycle if the function returns true,  I
suppose data_dep_in_cycle_p should be better.
>
>> +{
>> +  struct data_dependence_relation *ddr;
>> +
>> +  /* Re-shuffle data-refs to be in topological order.  */
>> +  if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
>> +      > rdg_vertex_for_stmt (rdg, DR_STMT (dr2)))
>> +    std::swap (dr1, dr2);
>> +
>> +  ddr = get_ddr (rdg, ddr_table, dr1, dr2);
>> +
>> +  /* In case something goes wrong in data dependence analysis.  */
>> +  if (ddr == NULL)
>> +    return true;
>> +  /* In case of no data dependence.  */
>> +  else if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
>> +    return false;
>> +  /* Or the data dependence can be resolved by compilation time alias
>> +     check.  */
>> +  else if (!alias_sets_conflict_p (get_alias_set (DR_REF (dr1)),
>> +                                  get_alias_set (DR_REF (dr2))))
>> +    return false;
>> +  /* For unknown data dependence or known data dependence which can't be
>> +     expressed in classic distance vector, we check if it can be resolved
>> +     by runtime alias check.  If yes, we still consider data dependence
>> +     as won't introduce data dependence cycle.  */
>> +  else if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know
>> +          || DDR_NUM_DIST_VECTS (ddr) == 0)
>
>
> You have already handled chrec_known above. Can you still have known data
> dependence which can't be expressed in classic distance vector ?
I don't know the very details in data dependence analyzer, only I tend
to believe it's possible by code.  Reading build_classic_dist_vector
gives:
  if (DDR_ARE_DEPENDENT (ddr) != NULL_TREE)
    return false;

  //...

  dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
  if (!build_classic_dist_vector_1 (ddr, DDR_A (ddr), DDR_B (ddr),
                    dist_v, &init_b, &index_carry))
    return false;

Looks like we can have DDR_ARE_DEPENDENT (ddr) == NULL_TREE without
classic distance vector.  Or the code could be simplified vice versa.
>
>> (dr1)
>> +               || !DR_BASE_ADDRESS (dr2) || !DR_OFFSET (dr2) || !DR_INIT
>> (dr2)
>> +               || !DR_STEP (dr1) || !tree_fits_uhwi_p (DR_STEP (dr1))
>> +               || !DR_STEP (dr2) || !tree_fits_uhwi_p (DR_STEP (dr2))
>> +               || res == 0)
>> +             this_dir = 2;
>> +           /* If it's possible to do runtime alias check, simply record
>> the
>> +              ddr.  */
>> +           else if (alias_ddrs != NULL)
>> +             alias_ddrs->safe_push (ddr);
>
>
> If alias_ddrs is not passed (i.e. NULL), shouldn't this_ddr = 2. May be add
> an assert for alias_ddrs ?
No, it's intended to ignore the dependence when alias_ddrs == NULL,  I
will add more comment for this.

>
>> +/* Build and return partition dependence graph for PARTITIONS.  RDG is
>> +   reduced dependence graph for the loop to be distributed.  DDR_TABLE
>> +   is hash table contains all data dependence relations.  ALIAS_DDRS is
>> +   a data dependence relations vector for temporary use.  If ALIAS_DDRS
>> +   is NULL, dependence which can be resolved by runtime alias check will
>> +   not be considered, vice versa.  */
>> +
>> +static struct graph *
>> +build_partition_graph (struct graph *rdg,
>> +                      hash_table<ddr_entry_hasher> *ddr_table,
>> +                      vec<struct partition *> *partitions,
>> +                      vec<ddr_p> *alias_ddrs)
>
>
> Why do you pass alias_ddrs to this. alias_ddrs does not pass any data or
> return any. It can be defined in the function and used there. If you are
> using this to indicate runtime alias check should be considered, you can
> define a different bool for that ?
I need to pass vector at two end of function calling stack, so I tried
to use vector pointer parameter for all related functions.  Apparently
this causes confusion for you, I will try the other way by using bool
parameter in next version patch.

>
>> +{
>> +
>> +static void
>> +break_alias_scc_partitions (struct graph *rdg,
>> +                           hash_table<ddr_entry_hasher> *ddr_table,
>> +                           vec<struct partition *> *partitions,
>> +                           vec<ddr_p> *alias_ddrs)
>
>
> I am not sure I understand this. When you are in pg_add_dependence_edges,
> when you record alias_ddrs for runtime checking you set this_dur io 1. That
> means you have broken the dpendency there itself. Were you planning to keep
No, it's not.  And thanks for catching this, it's in actuality a
mistake to set this_dir to 1 here.  I will explicitly set this_dir to
0 for alias case.  Setting it to 1 changes "alias" dependence into
"true" dependence, which could corrupt distribution opportunities.
> this_dir = 2 and break the dependency here ?
The dependence is to be broken in this function.
Thanks for reviewing, I am splitting patch into small ones and will
address above comments.

BTW, please remove long un-commented code piece when reviewing, I
scrolled a lot to find where the comment is.

Thanks,
bin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]