This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Vectorization opportunities for conditional branches.
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Ajit Kumar Agarwal <ajit dot kumar dot agarwal at xilinx dot com>
- Cc: Diego Novillo <dnovillo at google dot com>, "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>, Vinod Kathail <vinodk at xilinx dot com>, Shail Aditya Gupta <shailadi at xilinx dot com>, Vidhumouli Hunsigida <vidhum at xilinx dot com>, Nagaraju Mekala <nmekala at xilinx dot com>
- Date: Fri, 9 Jan 2015 10:19:27 +0100
- Subject: Re: Vectorization opportunities for conditional branches.
- Authentication-results: sourceware.org; auth=none
- References: <2b66a066a7a44e02a3477d9810eb2e4b at BL2FFO11FD039 dot protection dot gbl>
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