Statistiques
| Révision :

root / src / pgesv / HPL_pdupdateTT.c @ 9

Historique | Voir | Annoter | Télécharger (15,15 ko)

1 1 equemene
/*
2 1 equemene
 * -- High Performance Computing Linpack Benchmark (HPL)
3 1 equemene
 *    HPL - 2.0 - September 10, 2008
4 1 equemene
 *    Antoine P. Petitet
5 1 equemene
 *    University of Tennessee, Knoxville
6 1 equemene
 *    Innovative Computing Laboratory
7 1 equemene
 *    (C) Copyright 2000-2008 All Rights Reserved
8 1 equemene
 *
9 1 equemene
 * -- Copyright notice and Licensing terms:
10 1 equemene
 *
11 1 equemene
 * Redistribution  and  use in  source and binary forms, with or without
12 1 equemene
 * modification, are  permitted provided  that the following  conditions
13 1 equemene
 * are met:
14 1 equemene
 *
15 1 equemene
 * 1. Redistributions  of  source  code  must retain the above copyright
16 1 equemene
 * notice, this list of conditions and the following disclaimer.
17 1 equemene
 *
18 1 equemene
 * 2. Redistributions in binary form must reproduce  the above copyright
19 1 equemene
 * notice, this list of conditions,  and the following disclaimer in the
20 1 equemene
 * documentation and/or other materials provided with the distribution.
21 1 equemene
 *
22 1 equemene
 * 3. All  advertising  materials  mentioning  features  or  use of this
23 1 equemene
 * software must display the following acknowledgement:
24 1 equemene
 * This  product  includes  software  developed  at  the  University  of
25 1 equemene
 * Tennessee, Knoxville, Innovative Computing Laboratory.
26 1 equemene
 *
27 1 equemene
 * 4. The name of the  University,  the name of the  Laboratory,  or the
28 1 equemene
 * names  of  its  contributors  may  not  be used to endorse or promote
29 1 equemene
 * products  derived   from   this  software  without  specific  written
30 1 equemene
 * permission.
31 1 equemene
 *
32 1 equemene
 * -- Disclaimer:
33 1 equemene
 *
34 1 equemene
 * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 1 equemene
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
36 1 equemene
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37 1 equemene
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
38 1 equemene
 * OR  CONTRIBUTORS  BE  LIABLE FOR ANY  DIRECT,  INDIRECT,  INCIDENTAL,
39 1 equemene
 * SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES  (INCLUDING,  BUT NOT
40 1 equemene
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41 1 equemene
 * DATA OR PROFITS; OR BUSINESS INTERRUPTION)  HOWEVER CAUSED AND ON ANY
42 1 equemene
 * THEORY OF LIABILITY, WHETHER IN CONTRACT,  STRICT LIABILITY,  OR TORT
43 1 equemene
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44 1 equemene
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 1 equemene
 * ---------------------------------------------------------------------
46 1 equemene
 */
47 1 equemene
/*
48 1 equemene
 * Include files
49 1 equemene
 */
50 1 equemene
#include "hpl.h"
51 1 equemene
52 1 equemene
#ifdef STDC_HEADERS
53 1 equemene
void HPL_pdupdateTT
54 1 equemene
(
55 1 equemene
   HPL_T_panel *                    PBCST,
56 1 equemene
   int *                            IFLAG,
57 1 equemene
   HPL_T_panel *                    PANEL,
58 1 equemene
   const int                        NN
59 1 equemene
)
60 1 equemene
#else
61 1 equemene
void HPL_pdupdateTT
62 1 equemene
( PBCST, IFLAG, PANEL, NN )
63 1 equemene
   HPL_T_panel *                    PBCST;
64 1 equemene
   int *                            IFLAG;
65 1 equemene
   HPL_T_panel *                    PANEL;
66 1 equemene
   const int                        NN;
67 1 equemene
#endif
68 1 equemene
{
69 1 equemene
/*
70 1 equemene
 * Purpose
71 1 equemene
 * =======
72 1 equemene
 *
73 1 equemene
 * HPL_pdupdateTT broadcast - forward the panel PBCST and simultaneously
74 1 equemene
 * applies the row interchanges and updates part of the trailing  (using
75 1 equemene
 * the panel PANEL) submatrix.
76 1 equemene
 *
77 1 equemene
 * Arguments
78 1 equemene
 * =========
79 1 equemene
 *
80 1 equemene
 * PBCST   (local input/output)          HPL_T_panel *
81 1 equemene
 *         On entry,  PBCST  points to the data structure containing the
82 1 equemene
 *         panel (to be broadcast) information.
83 1 equemene
 *
84 1 equemene
 * IFLAG   (local output)                int *
85 1 equemene
 *         On exit,  IFLAG  indicates  whether or not  the broadcast has
86 1 equemene
 *         been completed when PBCST is not NULL on entry. In that case,
87 1 equemene
 *         IFLAG is left unchanged.
88 1 equemene
 *
89 1 equemene
 * PANEL   (local input/output)          HPL_T_panel *
90 1 equemene
 *         On entry,  PANEL  points to the data structure containing the
91 1 equemene
 *         panel (to be updated) information.
92 1 equemene
 *
93 1 equemene
 * NN      (local input)                 const int
94 1 equemene
 *         On entry, NN specifies  the  local  number  of columns of the
95 1 equemene
 *         trailing  submatrix  to be updated  starting  at the  current
96 1 equemene
 *         position. NN must be at least zero.
97 1 equemene
 *
98 1 equemene
 * ---------------------------------------------------------------------
99 1 equemene
 */
100 1 equemene
/*
101 1 equemene
 * .. Local Variables ..
102 1 equemene
 */
103 1 equemene
   double                    * Aptr, * L1ptr, * L2ptr, * Uptr, * dpiv;
104 1 equemene
   int                       * ipiv;
105 1 equemene
#ifdef HPL_CALL_VSIPL
106 1 equemene
   vsip_mview_d              * Av0, * Av1, * Lv0, * Lv1, * Uv0, * Uv1;
107 1 equemene
#endif
108 1 equemene
   int                       curr, i, iroff, jb, lda, ldl2, mp, n, nb,
109 1 equemene
                             nq0, nn, test;
110 1 equemene
   static int                tswap = 0;
111 1 equemene
   static HPL_T_SWAP         fswap = HPL_NO_SWP;
112 1 equemene
#define LDU                  n
113 1 equemene
/* ..
114 1 equemene
 * .. Executable Statements ..
115 1 equemene
 */
116 1 equemene
#ifdef HPL_DETAILED_TIMING
117 1 equemene
   HPL_ptimer( HPL_TIMING_UPDATE );
118 1 equemene
#endif
119 1 equemene
   nb = PANEL->nb; jb = PANEL->jb; n = PANEL->nq; lda = PANEL->lda;
120 1 equemene
   if( NN >= 0 ) n = Mmin( NN, n );
121 1 equemene
/*
122 1 equemene
 * There is nothing to update, enforce the panel broadcast.
123 1 equemene
 */
124 1 equemene
   if( ( n <= 0 ) || ( jb <= 0 ) )
125 1 equemene
   {
126 1 equemene
      if( PBCST != NULL )
127 1 equemene
      {
128 1 equemene
         do { (void) HPL_bcast( PBCST, IFLAG ); }
129 1 equemene
         while( *IFLAG != HPL_SUCCESS );
130 1 equemene
      }
131 1 equemene
#ifdef HPL_DETAILED_TIMING
132 1 equemene
      HPL_ptimer( HPL_TIMING_UPDATE );
133 1 equemene
#endif
134 1 equemene
      return;
135 1 equemene
   }
136 1 equemene
/*
137 1 equemene
 * Enable/disable the column panel probing mechanism
138 1 equemene
 */
139 1 equemene
   (void) HPL_bcast( PBCST, &test );
140 1 equemene
/*
141 1 equemene
 * 1 x Q case
142 1 equemene
 */
143 1 equemene
   if( PANEL->grid->nprow == 1 )
144 1 equemene
   {
145 1 equemene
      Aptr = PANEL->A;       L2ptr = PANEL->L2;   L1ptr = PANEL->L1;
146 1 equemene
      ldl2 = PANEL->ldl2;    dpiv  = PANEL->DPIV; ipiv  = PANEL->IWORK;
147 1 equemene
      mp   = PANEL->mp - jb; iroff = PANEL->ii;   nq0   = 0;
148 1 equemene
#ifdef HPL_CALL_VSIPL
149 1 equemene
/*
150 1 equemene
 * Admit the blocks
151 1 equemene
 */
152 1 equemene
      (void) vsip_blockadmit_d(  PANEL->Ablock,  VSIP_TRUE );
153 1 equemene
      (void) vsip_blockadmit_d(  PANEL->L2block, VSIP_TRUE );
154 1 equemene
/*
155 1 equemene
 * Create the matrix views
156 1 equemene
 */
157 1 equemene
      Av0 = vsip_mbind_d( PANEL->Ablock,  0, 1, lda,  lda,  PANEL->pmat->nq );
158 1 equemene
      Lv0 = vsip_mbind_d( PANEL->L2block, 0, 1, ldl2, ldl2,              jb );
159 1 equemene
/*
160 1 equemene
 * Create the matrix subviews
161 1 equemene
 */
162 1 equemene
      Lv1 = vsip_msubview_d( Lv0, 0, 0, mp, jb );
163 1 equemene
#endif
164 1 equemene
      for( i = 0; i < jb; i++ ) { ipiv[i] = (int)(dpiv[i]) - iroff; }
165 1 equemene
/*
166 1 equemene
 * So far we have not updated anything -  test availability of the panel
167 1 equemene
 * to be forwarded - If detected forward it and finish the update in one
168 1 equemene
 * step.
169 1 equemene
 */
170 1 equemene
      while ( test == HPL_KEEP_TESTING )
171 1 equemene
      {
172 1 equemene
         nn = n - nq0; nn = Mmin( nb, nn );
173 1 equemene
/*
174 1 equemene
 * Update nb columns at a time
175 1 equemene
 */
176 1 equemene
#ifdef HPL_DETAILED_TIMING
177 1 equemene
         HPL_ptimer( HPL_TIMING_LASWP );
178 1 equemene
         HPL_dlaswp00N( jb, nn, Aptr, lda, ipiv );
179 1 equemene
         HPL_ptimer( HPL_TIMING_LASWP );
180 1 equemene
#else
181 1 equemene
         HPL_dlaswp00N( jb, nn, Aptr, lda, ipiv );
182 1 equemene
#endif
183 1 equemene
         HPL_dtrsm( HplColumnMajor, HplLeft, HplUpper, HplTrans,
184 1 equemene
                    HplUnit, jb, nn, HPL_rone, L1ptr, jb, Aptr, lda );
185 1 equemene
#ifdef HPL_CALL_VSIPL
186 1 equemene
/*
187 1 equemene
 * Create the matrix subviews
188 1 equemene
 */
189 1 equemene
         Uv1 = vsip_msubview_d( Av0, PANEL->ii,    PANEL->jj+nq0, jb, nn );
190 1 equemene
         Av1 = vsip_msubview_d( Av0, PANEL->ii+jb, PANEL->jj+nq0, mp, nn );
191 1 equemene
192 1 equemene
         vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_NTRANS,
193 1 equemene
                      HPL_rone, Av1 );
194 1 equemene
/*
195 1 equemene
 * Destroy the matrix subviews
196 1 equemene
 */
197 1 equemene
         (void) vsip_mdestroy_d( Av1 );
198 1 equemene
         (void) vsip_mdestroy_d( Uv1 );
199 1 equemene
#else
200 1 equemene
         HPL_dgemm( HplColumnMajor, HplNoTrans, HplNoTrans, mp, nn,
201 1 equemene
                    jb, -HPL_rone, L2ptr, ldl2, Aptr, lda, HPL_rone,
202 1 equemene
                    Mptr( Aptr, jb, 0, lda ), lda );
203 1 equemene
#endif
204 1 equemene
         Aptr = Mptr( Aptr, 0, nn, lda ); nq0 += nn;
205 1 equemene
206 1 equemene
         (void) HPL_bcast( PBCST, &test );
207 1 equemene
      }
208 1 equemene
/*
209 1 equemene
 * The panel has been forwarded at that point, finish the update
210 1 equemene
 */
211 1 equemene
      if( ( nn = n - nq0 ) > 0 )
212 1 equemene
      {
213 1 equemene
#ifdef HPL_DETAILED_TIMING
214 1 equemene
         HPL_ptimer( HPL_TIMING_LASWP );
215 1 equemene
         HPL_dlaswp00N( jb, nn, Aptr, lda, ipiv );
216 1 equemene
         HPL_ptimer( HPL_TIMING_LASWP );
217 1 equemene
#else
218 1 equemene
         HPL_dlaswp00N( jb, nn, Aptr, lda, ipiv );
219 1 equemene
#endif
220 1 equemene
         HPL_dtrsm( HplColumnMajor, HplLeft, HplUpper, HplTrans,
221 1 equemene
                    HplUnit, jb, nn, HPL_rone, L1ptr, jb, Aptr, lda );
222 1 equemene
#ifdef HPL_CALL_VSIPL
223 1 equemene
/*
224 1 equemene
 * Create the matrix subviews
225 1 equemene
 */
226 1 equemene
         Uv1 = vsip_msubview_d( Av0, PANEL->ii,    PANEL->jj+nq0, jb, nn );
227 1 equemene
         Av1 = vsip_msubview_d( Av0, PANEL->ii+jb, PANEL->jj+nq0, mp, nn );
228 1 equemene
229 1 equemene
         vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_NTRANS,
230 1 equemene
                      HPL_rone, Av1 );
231 1 equemene
/*
232 1 equemene
 * Destroy the matrix subviews
233 1 equemene
 */
234 1 equemene
         (void) vsip_mdestroy_d( Av1 );
235 1 equemene
         (void) vsip_mdestroy_d( Uv1 );
236 1 equemene
#else
237 1 equemene
         HPL_dgemm( HplColumnMajor, HplNoTrans, HplNoTrans, mp, nn,
238 1 equemene
                    jb, -HPL_rone, L2ptr, ldl2, Aptr, lda, HPL_rone,
239 1 equemene
                    Mptr( Aptr, jb, 0, lda ), lda );
240 1 equemene
#endif
241 1 equemene
      }
242 1 equemene
#ifdef HPL_CALL_VSIPL
243 1 equemene
/*
244 1 equemene
 * Destroy the matrix subviews
245 1 equemene
 */
246 1 equemene
      (void) vsip_mdestroy_d( Lv1 );
247 1 equemene
/*
248 1 equemene
 * Release the blocks
249 1 equemene
 */
250 1 equemene
      (void) vsip_blockrelease_d( vsip_mgetblock_d( Lv0 ), VSIP_TRUE );
251 1 equemene
      (void) vsip_blockrelease_d( vsip_mgetblock_d( Av0 ), VSIP_TRUE );
252 1 equemene
/*
253 1 equemene
 * Destroy the matrix views
254 1 equemene
 */
255 1 equemene
      (void) vsip_mdestroy_d( Lv0 );
256 1 equemene
      (void) vsip_mdestroy_d( Av0 );
257 1 equemene
#endif
258 1 equemene
   }
259 1 equemene
   else                        /* nprow > 1 ... */
260 1 equemene
   {
261 1 equemene
/*
262 1 equemene
 * Selection of the swapping algorithm - swap:broadcast U.
263 1 equemene
 */
264 1 equemene
      if( fswap == HPL_NO_SWP )
265 1 equemene
      { fswap = PANEL->algo->fswap; tswap = PANEL->algo->fsthr; }
266 1 equemene
267 1 equemene
      if( (   fswap == HPL_SWAP01 ) ||
268 1 equemene
          ( ( fswap == HPL_SW_MIX ) && ( n > tswap ) ) )
269 1 equemene
      { HPL_pdlaswp01T( PBCST, &test, PANEL, n ); }
270 1 equemene
      else
271 1 equemene
      { HPL_pdlaswp00T( PBCST, &test, PANEL, n ); }
272 1 equemene
/*
273 1 equemene
 * Compute redundantly row block of U and update trailing submatrix
274 1 equemene
 */
275 1 equemene
      nq0 = 0; curr = ( PANEL->grid->myrow == PANEL->prow ? 1 : 0 );
276 1 equemene
      Aptr = PANEL->A; L2ptr = PANEL->L2;  L1ptr = PANEL->L1;
277 1 equemene
      Uptr = PANEL->U; ldl2 = PANEL->ldl2;
278 1 equemene
      mp   = PANEL->mp - ( curr != 0 ? jb : 0 );
279 1 equemene
#ifdef HPL_CALL_VSIPL
280 1 equemene
/*
281 1 equemene
 * Admit the blocks
282 1 equemene
 */
283 1 equemene
      (void) vsip_blockadmit_d(  PANEL->Ablock,  VSIP_TRUE );
284 1 equemene
      (void) vsip_blockadmit_d(  PANEL->L2block, VSIP_TRUE );
285 1 equemene
      (void) vsip_blockadmit_d(  PANEL->Ublock,  VSIP_TRUE );
286 1 equemene
/*
287 1 equemene
 * Create the matrix views
288 1 equemene
 */
289 1 equemene
      Av0 = vsip_mbind_d( PANEL->Ablock,  0, 1, lda,  lda,  PANEL->pmat->nq );
290 1 equemene
      Lv0 = vsip_mbind_d( PANEL->L2block, 0, 1, ldl2, ldl2,              jb );
291 1 equemene
      Uv0 = vsip_mbind_d( PANEL->Ublock,  0, 1, LDU,  LDU,               jb );
292 1 equemene
/*
293 1 equemene
 * Create the matrix subviews
294 1 equemene
 */
295 1 equemene
      Lv1 = vsip_msubview_d( Lv0, 0, 0, mp, jb );
296 1 equemene
#endif
297 1 equemene
/*
298 1 equemene
 * Broadcast has not occured yet, spliting the computational part
299 1 equemene
 */
300 1 equemene
      while ( test == HPL_KEEP_TESTING )
301 1 equemene
      {
302 1 equemene
         nn = n - nq0; nn = Mmin( nb, nn );
303 1 equemene
304 1 equemene
         HPL_dtrsm( HplColumnMajor, HplRight, HplUpper, HplNoTrans,
305 1 equemene
                    HplUnit, nn, jb, HPL_rone, L1ptr, jb, Uptr, LDU );
306 1 equemene
307 1 equemene
         if( curr != 0 )
308 1 equemene
         {
309 1 equemene
#ifdef HPL_CALL_VSIPL
310 1 equemene
/*
311 1 equemene
 * Create the matrix subviews
312 1 equemene
 */
313 1 equemene
            Uv1 = vsip_msubview_d( Uv0, nq0,          0,             nn, jb );
314 1 equemene
            Av1 = vsip_msubview_d( Av0, PANEL->ii+jb, PANEL->jj+nq0, mp, nn );
315 1 equemene
316 1 equemene
            vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_TRANS,
317 1 equemene
                         HPL_rone, Av1 );
318 1 equemene
/*
319 1 equemene
 * Destroy the matrix subviews
320 1 equemene
 */
321 1 equemene
            (void) vsip_mdestroy_d( Av1 );
322 1 equemene
            (void) vsip_mdestroy_d( Uv1 );
323 1 equemene
#else
324 1 equemene
            HPL_dgemm( HplColumnMajor, HplNoTrans, HplTrans, mp, nn,
325 1 equemene
                       jb, -HPL_rone, L2ptr, ldl2, Uptr, LDU, HPL_rone,
326 1 equemene
                       Mptr( Aptr, jb, 0, lda ), lda );
327 1 equemene
#endif
328 1 equemene
            HPL_dlatcpy( jb, nn, Uptr, LDU, Aptr, lda );
329 1 equemene
         }
330 1 equemene
         else
331 1 equemene
         {
332 1 equemene
#ifdef HPL_CALL_VSIPL
333 1 equemene
/*
334 1 equemene
 * Create the matrix subviews
335 1 equemene
 */
336 1 equemene
            Uv1 = vsip_msubview_d( Uv0, nq0,          0,             nn, jb );
337 1 equemene
            Av1 = vsip_msubview_d( Av0, PANEL->ii,    PANEL->jj+nq0, mp, nn );
338 1 equemene
339 1 equemene
            vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_TRANS,
340 1 equemene
                         HPL_rone, Av1 );
341 1 equemene
/*
342 1 equemene
 * Destroy the matrix subviews
343 1 equemene
 */
344 1 equemene
            (void) vsip_mdestroy_d( Av1 );
345 1 equemene
            (void) vsip_mdestroy_d( Uv1 );
346 1 equemene
#else
347 1 equemene
            HPL_dgemm( HplColumnMajor, HplNoTrans, HplTrans, mp, nn,
348 1 equemene
                       jb, -HPL_rone, L2ptr, ldl2, Uptr, LDU, HPL_rone,
349 1 equemene
                       Aptr, lda );
350 1 equemene
#endif
351 1 equemene
         }
352 1 equemene
         Uptr = Mptr( Uptr, nn, 0, LDU );
353 1 equemene
         Aptr = Mptr( Aptr, 0, nn, lda ); nq0 += nn;
354 1 equemene
355 1 equemene
         (void) HPL_bcast( PBCST, &test );
356 1 equemene
      }
357 1 equemene
/*
358 1 equemene
 * The panel has been forwarded at that point, finish the update
359 1 equemene
 */
360 1 equemene
      if( ( nn = n - nq0 ) > 0 )
361 1 equemene
      {
362 1 equemene
         HPL_dtrsm( HplColumnMajor, HplRight, HplUpper, HplNoTrans,
363 1 equemene
                    HplUnit, nn, jb, HPL_rone, L1ptr, jb, Uptr, LDU );
364 1 equemene
365 1 equemene
         if( curr != 0 )
366 1 equemene
         {
367 1 equemene
#ifdef HPL_CALL_VSIPL
368 1 equemene
/*
369 1 equemene
 * Create the matrix subviews
370 1 equemene
 */
371 1 equemene
            Uv1 = vsip_msubview_d( Uv0, nq0,          0,             nn, jb );
372 1 equemene
            Av1 = vsip_msubview_d( Av0, PANEL->ii+jb, PANEL->jj+nq0, mp, nn );
373 1 equemene
374 1 equemene
            vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_TRANS,
375 1 equemene
                         HPL_rone, Av1 );
376 1 equemene
/*
377 1 equemene
 * Destroy the matrix subviews
378 1 equemene
 */
379 1 equemene
            (void) vsip_mdestroy_d( Av1 );
380 1 equemene
            (void) vsip_mdestroy_d( Uv1 );
381 1 equemene
#else
382 1 equemene
            HPL_dgemm( HplColumnMajor, HplNoTrans, HplTrans, mp, nn,
383 1 equemene
                       jb, -HPL_rone, L2ptr, ldl2, Uptr, LDU, HPL_rone,
384 1 equemene
                       Mptr( Aptr, jb, 0, lda ), lda );
385 1 equemene
#endif
386 1 equemene
            HPL_dlatcpy( jb, nn, Uptr, LDU, Aptr, lda );
387 1 equemene
         }
388 1 equemene
         else
389 1 equemene
         {
390 1 equemene
#ifdef HPL_CALL_VSIPL
391 1 equemene
/*
392 1 equemene
 * Create the matrix subviews
393 1 equemene
 */
394 1 equemene
            Uv1 = vsip_msubview_d( Uv0, nq0,          0,             nn, jb );
395 1 equemene
            Av1 = vsip_msubview_d( Av0, PANEL->ii,    PANEL->jj+nq0, mp, nn );
396 1 equemene
397 1 equemene
            vsip_gemp_d( -HPL_rone, Lv1, VSIP_MAT_NTRANS, Uv1, VSIP_MAT_TRANS,
398 1 equemene
                         HPL_rone, Av1 );
399 1 equemene
/*
400 1 equemene
 * Destroy the matrix subviews
401 1 equemene
 */
402 1 equemene
            (void) vsip_mdestroy_d( Av1 );
403 1 equemene
            (void) vsip_mdestroy_d( Uv1 );
404 1 equemene
#else
405 1 equemene
            HPL_dgemm( HplColumnMajor, HplNoTrans, HplTrans, mp, nn,
406 1 equemene
                       jb, -HPL_rone, L2ptr, ldl2, Uptr, LDU, HPL_rone,
407 1 equemene
                       Aptr, lda );
408 1 equemene
#endif
409 1 equemene
         }
410 1 equemene
      }
411 1 equemene
#ifdef HPL_CALL_VSIPL
412 1 equemene
/*
413 1 equemene
 * Destroy the matrix subviews
414 1 equemene
 */
415 1 equemene
      (void) vsip_mdestroy_d( Lv1 );
416 1 equemene
/*
417 1 equemene
 * Release the blocks
418 1 equemene
 */
419 1 equemene
      (void) vsip_blockrelease_d( vsip_mgetblock_d( Uv0 ), VSIP_TRUE );
420 1 equemene
      (void) vsip_blockrelease_d( vsip_mgetblock_d( Lv0 ), VSIP_TRUE );
421 1 equemene
      (void) vsip_blockrelease_d( vsip_mgetblock_d( Av0 ), VSIP_TRUE );
422 1 equemene
/*
423 1 equemene
 * Destroy the matrix views
424 1 equemene
 */
425 1 equemene
      (void) vsip_mdestroy_d( Uv0 );
426 1 equemene
      (void) vsip_mdestroy_d( Lv0 );
427 1 equemene
      (void) vsip_mdestroy_d( Av0 );
428 1 equemene
#endif
429 1 equemene
   }
430 1 equemene
431 1 equemene
   PANEL->A = Mptr( PANEL->A, 0, n, lda ); PANEL->nq -= n; PANEL->jj += n;
432 1 equemene
/*
433 1 equemene
 * return the outcome of the probe  (should always be  HPL_SUCCESS,  the
434 1 equemene
 * panel broadcast is enforced in that routine).
435 1 equemene
 */
436 1 equemene
   if( PBCST != NULL ) *IFLAG = test;
437 1 equemene
#ifdef HPL_DETAILED_TIMING
438 1 equemene
   HPL_ptimer( HPL_TIMING_UPDATE );
439 1 equemene
#endif
440 1 equemene
/*
441 1 equemene
 * End of HPL_pdupdateTT
442 1 equemene
 */
443 1 equemene
}