This is the mail archive of the gcc@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: Vectorization opportunities for conditional branches.


On Mon, Jan 5, 2015 at 3:27 AM, Ajit Kumar Agarwal
<ajit.kumar.agarwal@xilinx.com> wrote:
>
> The following fig (1) shows an implementation of the SSQ kernel from the BLAS Library in ATLAS.
> Fig(2) shows the conversions of the IF-THEN-ELSE in Fig(1) to vectorized code. Normally in the automatic vectorization the IF-THEN-ELSE is
> vectorized  only after the IF-CONVERSION that  converts control flow to Data flow and then raise the opportunity of vectorization.
>
> The Fig(1) and Fig(2) is taken from the article
>
> " Vectorization Past Dependent Branches through speculation" Qing Yi etal.
>
> The following conversion given in the above article checks the IF-THEN and IF-ELSE separately and checks for the candidates of vectorization.
> If the IF-THEN can be vectorized and IF-ELSE cannot be vectorized and the whole  conversion given in the Fig (2) shows how the conditional branches
> can be  vectorized.
>
> In the below case the IF-THEN-ELSE need not be IF-CONVERTED and the conditional branches is vectorized  by the transformation shown in FIG (2).
>
> ssq = *ssq0;
> scal = *scal0;
>
> For(i=0;I < N ;i++)
> {
>     ax= x[i];
>     ax = ABS & Ax;
>     If( ax <=scal)
>     {
>          t0= ax/scal;
>          ssq+= t0 * t0;
>     }
>    Else
>    {
>        t0= scal/ax;
>        t0 = t0 * t0;
>         t1= ssq * t0;
>         ssq = 1.0 + t1;
>        scal = ax;
>    }
> }
>  *ssq0 = ssq;
> *scal0 = scal;
>
> FIG ( 1)
>
>   Transformed to
>
> VECTOR_PROLOGUE:
> VABS = {ABS, ABS, ABS, ABS};
> Vssq = {ssq0, 0.0, 0.0, 0.0};
> Vscal =  { scal, scal, scal , scal};
>
> VECTOR_LOOP:
> For(i=0;I < N4 ;i++)
> {
>     Vax= x[i: I+3];
>     Vax = VABS & Vax;
>     If( VEC_ANY(Vax  > Vscal)
>       GOTO SCALAR_RESTART;
>
>       Vt0= vax/vscal;
>        Vssq+= Vt0 *V t0;
>        continue;
>
>    SCALAR_RESTART:
>   // Vector to Scalar.
>
>    Ssq= sum(vssq[0:3]);
>
> // Scalar Loop
> For(j=0;I < 4 ;j++)
> {
>     ax= x[i+j];
>     ax = AbS & Ax;
>     If( ax >scal)
>     {
>          t0= scal/ax;
>        t0 = t0 * t0;
>         t1= ssq * t0;
>         ssq = 1.0 + t1;
>        scal = ax;
>     }
>     Else{
>          t0= ax/scal;
>          ssq+= t0 * t0;
>     }
>  }
>   Vssq= { ssq, 0.0, 0.0, 0.0};
>   Vscal = { scal, scal, scal, scal}
>
> }
> VECTOR_EPILOGUE:
>
> ssq = sum(Vssq[0:3]);
> scal = Vscal[0];
>
>   FIG(2).
>
> This looks interesting to me  considering the IF-THEN-ELSE inside the Loop to be vectorized as given above without IF-Converting.
> I am not sure how many such sequences of the code will be triggered for SPEC benchmark but it looks interesting to me to be
> implemented.
>
> Thoughts Please ?

Surely interesting, but I'd say that without profile data it might be hardly
profitable in practice.

Richard.

> Thanks & Regards
> Ajit


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