1
/* ---------------------------------------------------------------------
3
* -- Automatically Tuned Linear Algebra Software (ATLAS)
4
* (C) Copyright 2000 All Rights Reserved
6
* -- ATLAS routine -- Version 3.2 -- December 25, 2000
8
* -- Suggestions, comments, bugs reports should be sent to the follo-
9
* wing e-mail address: atlas@cs.utk.edu
11
* Author : Antoine P. Petitet
12
* University of Tennessee - Innovative Computing Laboratory
13
* Knoxville TN, 37996-1301, USA.
15
* ---------------------------------------------------------------------
17
* -- Copyright notice and Licensing terms:
19
* Redistribution and use in source and binary forms, with or without
20
* modification, are permitted provided that the following conditions
23
* 1. Redistributions of source code must retain the above copyright
24
* notice, this list of conditions and the following disclaimer.
25
* 2. Redistributions in binary form must reproduce the above copyright
26
* notice, this list of conditions, and the following disclaimer in
27
* the documentation and/or other materials provided with the distri-
29
* 3. The name of the University, the ATLAS group, or the names of its
30
* contributors may not be used to endorse or promote products deri-
31
* ved from this software without specific written permission.
35
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
39
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
40
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
41
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
42
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
43
* RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (IN-
44
* CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
45
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47
* ---------------------------------------------------------------------
52
#include "atlas_ptmisc.h"
53
#include "atlas_ptlvl3.h"
54
#include "atlas_ptlevel3.h"
58
const PT_LVL3_TYPE_T * PLVL3,
59
const unsigned int NODE,
60
const unsigned int NTHREADS,
61
pthread_attr_t * ATTR,
63
const enum ATLAS_SIDE SIDE,
64
const enum ATLAS_UPLO UPLO,
65
const enum ATLAS_TRANS TRANS,
66
const enum ATLAS_DIAG DIAG,
77
* .. Local Variables ..
79
PT_TREE_T left, right, tree = NULL;
80
PT_TRSM_ARGS_T * a_sm = NULL;
82
DIM_1DSPLIT_T splitM, splitN;
84
unsigned int next = ( NODE << 1 ), ntm1, ntm2, ntn1, ntn2;
85
int incB, m1, m2, n1, n2;
87
* .. Executable Statements ..
90
if( NTHREADS < 1 ) return( NULL );
94
if( SIDE == AtlasLeft )
96
splitN = ATL_1dsplit( NTHREADS, N, NB, &ntn1, &ntn2, &n1, &n2, &rn );
98
if( splitN == Atlas1dSplit )
100
left = ATL_Strsm( PLVL3, next+1, ntn1, ATTR, NB, SIDE, UPLO, TRANS,
101
DIAG, M, n1, ALPHA, A, LDA, B, LDB );
103
right = ATL_Strsm( PLVL3, next+2, ntn2, ATTR, NB, SIDE, UPLO, TRANS,
104
DIAG, M, n2, ALPHA, A, LDA, Mvpt3( B, incB,
106
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
110
a_sm = (PT_TRSM_ARGS_T *)malloc( sizeof( PT_TRSM_ARGS_T ) );
111
ATL_assert( a_sm != NULL );
112
a_sm->si = SIDE; a_sm->up = UPLO; a_sm->tr = TRANS; a_sm->di = DIAG;
113
a_sm->m = M; a_sm->n = N; a_sm->al = ALPHA;
114
a_sm->a = A; a_sm->la = LDA; a_sm->b = B; a_sm->lb = LDB;
115
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL, PLVL3->trsm0,
121
splitM = ATL_1dsplit( NTHREADS, M, NB, &ntm1, &ntm2, &m1, &m2, &rm );
123
if( splitM == Atlas1dSplit )
125
left = ATL_Strsm( PLVL3, next+1, ntm1, ATTR, NB, SIDE, UPLO, TRANS,
126
DIAG, m1, N, ALPHA, A, LDA, B, LDB );
128
right = ATL_Strsm( PLVL3, next+2, ntm2, ATTR, NB, SIDE, UPLO, TRANS,
129
DIAG, m2, N, ALPHA, A, LDA, Mvpt3( B, incB,
131
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
135
a_sm = (PT_TRSM_ARGS_T *)malloc( sizeof( PT_TRSM_ARGS_T ) );
136
ATL_assert( a_sm != NULL );
137
a_sm->si = SIDE; a_sm->up = UPLO; a_sm->tr = TRANS; a_sm->di = DIAG;
138
a_sm->m = M; a_sm->n = N; a_sm->al = ALPHA;
139
a_sm->a = A; a_sm->la = LDA; a_sm->b = B; a_sm->lb = LDB;
140
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL, PLVL3->trsm0,