2
/* ---------------------------------------------------------------------
4
* -- Automatically Tuned Linear Algebra Software (ATLAS)
5
* (C) Copyright 2000 All Rights Reserved
7
* -- ATLAS routine -- Version 3.2 -- December 25, 2000
9
* Author : Antoine P. Petitet
10
* Originally developed at the University of Tennessee,
11
* Innovative Computing Laboratory, Knoxville TN, 37996-1301, USA.
13
* ---------------------------------------------------------------------
15
* -- Copyright notice and Licensing terms:
17
* Redistribution and use in source and binary forms, with or without
18
* modification, are permitted provided that the following conditions
21
* 1. Redistributions of source code must retain the above copyright
22
* notice, this list of conditions and the following disclaimer.
23
* 2. Redistributions in binary form must reproduce the above copyright
24
* notice, this list of conditions, and the following disclaimer in
25
* the documentation and/or other materials provided with the distri-
27
* 3. The name of the University, the ATLAS group, or the names of its
28
* contributors may not be used to endorse or promote products deri-
29
* ved from this software without specific written permission.
33
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
34
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
35
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
36
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
37
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
38
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
39
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
40
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
41
* RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (IN-
42
* CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45
* ---------------------------------------------------------------------
51
#include "atlas_ptmisc.h"
52
#include "atlas_ptlvl3.h"
53
#include "atlas_ptlevel3.h"
57
const PT_LVL3_TYPE_T * PLVL3,
58
const unsigned int NODE,
59
const unsigned int NTHREADS,
60
pthread_attr_t * ATTR,
62
const enum ATLAS_SIDE SIDE,
63
const enum ATLAS_UPLO UPLO,
64
const enum ATLAS_TRANS TRANS,
65
const enum ATLAS_DIAG DIAG,
76
* .. Local Variables ..
78
PT_TREE_T left, right, tree = NULL;
79
PT_TRSM_ARGS_T * a_sm = NULL;
81
DIM_1DSPLIT_T splitM, splitN;
83
unsigned int next = ( NODE << 1 ), ntm1, ntm2, ntn1, ntn2;
84
int incB, m1, m2, n1, n2;
86
* .. Executable Statements ..
89
if( NTHREADS < 1 ) return( NULL );
93
if( SIDE == AtlasLeft )
95
splitN = ATL_1dsplit( NTHREADS, N, NB, &ntn1, &ntn2, &n1, &n2, &rn );
97
if( splitN == Atlas1dSplit )
99
left = ATL_Strsm( PLVL3, next+1, ntn1, ATTR, NB, SIDE, UPLO, TRANS,
100
DIAG, M, n1, ALPHA, A, LDA, B, LDB );
102
right = ATL_Strsm( PLVL3, next+2, ntn2, ATTR, NB, SIDE, UPLO, TRANS,
103
DIAG, M, n2, ALPHA, A, LDA, Mvpt3( B, incB,
105
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
109
a_sm = (PT_TRSM_ARGS_T *)malloc( sizeof( PT_TRSM_ARGS_T ) );
110
ATL_assert( a_sm != NULL );
111
a_sm->si = SIDE; a_sm->up = UPLO; a_sm->tr = TRANS; a_sm->di = DIAG;
112
a_sm->m = M; a_sm->n = N; a_sm->al = ALPHA;
113
a_sm->a = A; a_sm->la = LDA; a_sm->b = B; a_sm->lb = LDB;
114
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL, PLVL3->trsm0,
120
splitM = ATL_1dsplit( NTHREADS, M, NB, &ntm1, &ntm2, &m1, &m2, &rm );
122
if( splitM == Atlas1dSplit )
124
left = ATL_Strsm( PLVL3, next+1, ntm1, ATTR, NB, SIDE, UPLO, TRANS,
125
DIAG, m1, N, ALPHA, A, LDA, B, LDB );
127
right = ATL_Strsm( PLVL3, next+2, ntm2, ATTR, NB, SIDE, UPLO, TRANS,
128
DIAG, m2, N, ALPHA, A, LDA, Mvpt3( B, incB,
130
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
134
a_sm = (PT_TRSM_ARGS_T *)malloc( sizeof( PT_TRSM_ARGS_T ) );
135
ATL_assert( a_sm != NULL );
136
a_sm->si = SIDE; a_sm->up = UPLO; a_sm->tr = TRANS; a_sm->di = DIAG;
137
a_sm->m = M; a_sm->n = N; a_sm->al = ALPHA;
138
a_sm->a = A; a_sm->la = LDA; a_sm->b = B; a_sm->lb = LDB;
139
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL, PLVL3->trsm0,