PLASMA  2.4.5
PLASMA - Parallel Linear Algebra for Scalable Multi-core Architectures
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
core_sgblrx.c
Go to the documentation of this file.
1 
15 #include <lapacke.h>
16 #include "common.h"
17 
18 /***************************************************************************/
70 /***************************************************************************/
74 #define A(_m, _n) (float *)plasma_geteltaddr(A, ((_m)-1), ((_n)-1), eltsize)
75 #define V(_m) &(V[(_m)-1])
76 #define TAU(_m) &(TAU[(_m)-1])
77 int
78 CORE_sgblrx(int uplo, int N,
79  PLASMA_desc *A,
80  float *V,
81  float *TAU,
82  int st,
83  int ed,
84  int eltsize)
85 {
86  int NB, J1, J2;
87  int len1, len2, t1ed, t2st;
88  int i;
89  PLASMA_desc vA=*A;
90 
91  /* Check input arguments */
92  if (N < 0) {
93  coreblas_error(2, "Illegal value of N");
94  return -2;
95  }
96  if (ed <= st) {
97  coreblas_error(6, "Illegal value of st and ed (internal)");
98  return -6;
99  }
100 
101  /* Quick return */
102  if (N == 0)
103  return PLASMA_SUCCESS;
104 
105  NB = A->mb;
106  if( uplo == PlasmaLower ){
107  /* ========================
108  * LOWER CASE
109  * ========================*/
110  for (i = ed; i >= st+1 ; i--){
111  /* apply reflector from the left (horizontal row) and from the right for only the diagonal 2x2.*/
112  J1 = st;
113  J2 = i-2;
114  t1ed = (J2/NB)*NB;
115  t2st = max(t1ed+1,J1);
116  len1 = t1ed-J1+1;
117  len2 = J2-t2st+1;
118  if(len1>0)CORE_slarfx2(PlasmaLeft, len1 , *V(i), (*TAU(i)), A(i-1, J1 ), ELTLDD(vA, (i-1)), A(i, J1 ), ELTLDD(vA, i) );
119  if(len2>0)CORE_slarfx2(PlasmaLeft, len2 , *V(i), (*TAU(i)), A(i-1, t2st), ELTLDD(vA, (i-1)), A(i, t2st), ELTLDD(vA, i) );
120  CORE_slarfx2ce(PlasmaLower, V(i), TAU(i), A(i-1,i-1), A(i,i-1), A(i,i));
121  }
122  /* APPLY RIGHT ON THE REMAINING ELEMENT OF KERNEL 1 */
123  for (i = ed; i >= st+1 ; i--){
124  J1 = i+1;
125  J2 = min(ed,N);
126  t1ed = (J2/NB)*NB;
127  t2st = max(t1ed+1,J1);
128  len1 = t1ed-J1+1;
129  len2 = J2-t2st+1;
130  if(len1>0)CORE_slarfx2(PlasmaRight, len1, (*V(i)), (*TAU(i)), A(J1,i-1), ELTLDD(vA, J1) , A(J1 , i), ELTLDD(vA, J1) );
131  if(len2>0)CORE_slarfx2(PlasmaRight, len2, (*V(i)), (*TAU(i)), A(t2st,i-1), ELTLDD(vA, t2st), A(t2st, i), ELTLDD(vA, t2st) );
132  }
133  } else {
134  /* ========================
135  * UPPER CASE
136  * ========================*/
137  for (i = ed; i >= st+1 ; i--){
138  /* apply reflector from the left (horizontal row) and from the right for only the diagonal 2x2.*/
139  J1 = st;
140  J2 = i-2;
141  t1ed = (J2/NB)*NB;
142  t2st = max(t1ed+1,J1);
143  len1 = t1ed-J1+1;
144  len2 = J2-t2st+1;
145  if(len1>0)CORE_slarfx2(PlasmaRight, len1, (*V(i)), (*TAU(i)), A(J1,i-1), ELTLDD(vA, J1) , A(J1 , i), ELTLDD(vA, J1) );
146  if(len2>0)CORE_slarfx2(PlasmaRight, len2, (*V(i)), (*TAU(i)), A(t2st,i-1), ELTLDD(vA, t2st), A(t2st, i), ELTLDD(vA, t2st) );
147  CORE_slarfx2ce(PlasmaUpper, V(i), TAU(i), A(i-1,i-1), A(i-1, i), A(i,i));
148  }
149  /* APPLY LEFT ON THE REMAINING ELEMENT OF KERNEL 1 */
150  for (i = ed; i >= st+1 ; i--){
151  J1 = i+1;
152  J2 = min(ed,N);
153  t1ed = (J2/NB)*NB;
154  t2st = max(t1ed+1,J1);
155  len1 = t1ed-J1+1;
156  len2 = J2-t2st+1;
157  if(len1>0)CORE_slarfx2(PlasmaLeft, len1 , *V(i), (*TAU(i)), A(i-1, J1 ), ELTLDD(vA, (i-1)), A(i, J1 ), ELTLDD(vA, i) );
158  if(len2>0)CORE_slarfx2(PlasmaLeft, len2 , *V(i), (*TAU(i)), A(i-1, t2st), ELTLDD(vA, (i-1)), A(i, t2st), ELTLDD(vA, i) );
159  }
160  } /* end of else for the upper case */
161 
162  return PLASMA_SUCCESS;
163 }