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_TRANS TGEMM,
63
const enum ATLAS_SIDE SIDE,
64
const enum ATLAS_UPLO UPLO,
78
* .. Local Variables ..
80
PT_TREE_T left, right, tree = NULL;
81
PT_SYMM_ARGS_T * a_mm = NULL;
83
DIM_1DSPLIT_T splitM, splitN;
85
unsigned int next = ( NODE << 1 ), ntm1, ntm2, ntn1, ntn2;
86
int incB, incC, m1, m2, n1, n2;
88
* .. Executable Statements ..
91
if( NTHREADS < 1 ) return( tree );
95
if( SIDE == AtlasLeft )
97
splitN = ATL_1dsplit( NTHREADS, N, NB, &ntn1, &ntn2, &n1, &n2, &rn );
99
if( splitN == Atlas1dSplit )
101
left = ATL_Ssymm( PLVL3, next+1, ntn1, ATTR, NB, TGEMM, SIDE, UPLO,
102
M, n1, ALPHA, A, LDA, B, LDB, BETA, C, LDC );
105
right = ATL_Ssymm( PLVL3, next+2, ntn2, ATTR, NB, TGEMM, SIDE, UPLO,
106
M, n2, ALPHA, A, LDA, Mvpt3( B, incB, size ), LDB,
107
BETA, Mvpt3( C, incC, size ), LDC );
108
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
112
a_mm = (PT_SYMM_ARGS_T *)malloc( sizeof( PT_SYMM_ARGS_T ) );
113
ATL_assert( a_mm != NULL );
114
a_mm->si = SIDE; a_mm->up = UPLO;
115
a_mm->m = M; a_mm->n = N; a_mm->al = ALPHA;
116
a_mm->a = A; a_mm->la = LDA; a_mm->b = B; a_mm->lb = LDB;
117
a_mm->be = BETA; a_mm->c = C; a_mm->lc = LDC;
118
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL,
119
( TGEMM == AtlasConjTrans ? PLVL3->hemm0 :
120
PLVL3->symm0 ), (void *)(a_mm) );
125
splitM = ATL_1dsplit( NTHREADS, M, NB, &ntm1, &ntm2, &m1, &m2, &rm );
127
if( splitM == Atlas1dSplit )
129
left = ATL_Ssymm( PLVL3, next+1, ntm1, ATTR, NB, TGEMM, SIDE, UPLO,
130
m1, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC );
133
right = ATL_Ssymm( PLVL3, next+2, ntm2, ATTR, NB, TGEMM, SIDE, UPLO,
134
m2, N, ALPHA, A, LDA, Mvpt3( B, incB, size ), LDB,
135
BETA, Mvpt3( C, incC, size ), LDC );
136
tree = ATL_init_node( NODE, left, right, NULL, NULL, NULL, NULL );
140
a_mm = (PT_SYMM_ARGS_T *)malloc( sizeof( PT_SYMM_ARGS_T ) );
141
ATL_assert( a_mm != NULL );
142
a_mm->si = SIDE; a_mm->up = UPLO;
143
a_mm->m = M; a_mm->n = N; a_mm->al = ALPHA;
144
a_mm->a = A; a_mm->la = LDA; a_mm->b = B; a_mm->lb = LDB;
145
a_mm->be = BETA; a_mm->c = C; a_mm->lc = LDC;
146
tree = ATL_init_node( NODE, NULL, NULL, NULL, NULL,
147
( TGEMM == AtlasConjTrans ? PLVL3->hemm0 :
148
PLVL3->symm0 ), (void *)(a_mm) );