/* ---------------------------------------------------------------------
*
* -- Automatically Tuned Linear Algebra Software (ATLAS)
* (C) Copyright 2000 All Rights Reserved
*
* -- ATLAS routine -- Version 3.2 -- December 25, 2000
*
* Author : Antoine P. Petitet
* Originally developed at the University of Tennessee,
* Innovative Computing Laboratory, Knoxville TN, 37996-1301, USA.
*
* ---------------------------------------------------------------------
*
* -- Copyright notice and Licensing terms:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions, and the following disclaimer in
* the documentation and/or other materials provided with the distri-
* bution.
* 3. The name of the University, the ATLAS group, or the names of its
* contributors may not be used to endorse or promote products deri-
* ved from this software without specific written permission.
*
* -- Disclaimer:
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
* RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (IN-
* CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ---------------------------------------------------------------------
*/
#ifndef ATLAS_PTLVL3_H
#define ATLAS_PTLVL3_H
/*
* =====================================================================
* Include files
* =====================================================================
*/
#include "atlas_ptmisc.h"
#include "atlas_level3.h"
#include "atlas_rblas3.h"
/*
* =====================================================================
* macro constants
* =====================================================================
*/
#ifdef TREAL
#define ATL_XOVER_L3_DEFAULT 8 /* number of NB x NB blocks */
#else
#define ATL_XOVER_L3_DEFAULT 4
#endif
/*
* =====================================================================
* macro functions
* =====================================================================
*/
#define Mpt3( a_, i_, siz_ ) ( ( (char*)(a_) + ( (i_) * (siz_) ) ) )
#define Mvpt3( a_, i_, siz_ ) ( (void *)(Mpt3( (a_), (i_), (siz_) )))
/*
* =====================================================================
* typedef definitions
* =====================================================================
*/
typedef PT_TREE_T (*PT_GEMM_FUN_T)
(
const unsigned int, pthread_attr_t *,
const enum ATLAS_TRANS, const enum ATLAS_TRANS,
const int, const int, const int, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int
);
typedef PT_TREE_T (*PT_TRMM_FUN_T)
(
const unsigned int, pthread_attr_t *,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const void *, const void *,
const int, void *, const int
);
typedef int (*PT_SYR2K_FUN_T)
(
const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const enum ATLAS_TRANS, const int, const int,
const void *, const void *, const int, const void *,
const int, const void *, void *, const int
);
typedef struct
{
size_t size;
void * negone, * one, * zero;
PT_FUN_T geadd0, gemm0, symm0, hemm0, syrk0, syr2k0,
herk0, her2k0, trmm0, trsm0;
PT_GEMM_FUN_T ptgemm;
PT_TRMM_FUN_T pttrmm;
PT_SYR2K_FUN_T ptsyr2k0, pther2k0;
} PT_LVL3_TYPE_T;
typedef struct
{
const void * a, * al, * b, * be;
void * c;
enum ATLAS_TRANS ta, tb;
int k, la, lb, lc, m, n;
} PT_GEMM_ARGS_T;
typedef struct
{
const void * a, * al, * b, * be;
void * c;
enum ATLAS_SIDE si;
enum ATLAS_UPLO up;
int la, lb, lc, m, n;
} PT_SYMM_ARGS_T;
typedef struct
{
const void * a, * al, * be;
void * c;
enum ATLAS_UPLO up;
enum ATLAS_TRANS tr;
int l, la, lc, m, n, k;
} PT_SYRK_ARGS_T;
typedef struct
{
const void * a, * al, * ac, * b, * be;
void * c;
enum ATLAS_UPLO up;
enum ATLAS_TRANS tr;
int l, la, lb, lc, m, n, k;
} PT_SYR2K_ARGS_T;
typedef struct
{
const void * a, * al;
void * b;
enum ATLAS_SIDE si;
enum ATLAS_UPLO up;
enum ATLAS_TRANS tr;
enum ATLAS_DIAG di;
int la, lb, m, n;
} PT_TRMM_ARGS_T;
typedef struct
{
const void * a, * al;
void * b;
enum ATLAS_SIDE si;
enum ATLAS_UPLO up;
enum ATLAS_TRANS tr;
enum ATLAS_DIAG di;
int la, lb, m, n;
} PT_TRSM_ARGS_T;
/*
* =====================================================================
* Function prototypes
* =====================================================================
*/
PT_TREE_T ATL_Sgemm
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_TRANS, const enum ATLAS_TRANS,
const int, const int, const int, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int );
PT_TREE_T ATL_Ssymm
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_TRANS, const enum ATLAS_SIDE,
const enum ATLAS_UPLO, const int, const int,
const void *, const void *, const int, const void *,
const int, const void *, void *, const int );
PT_TREE_T ATL_Ssyrk
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const enum ATLAS_TRANS, const int, const int,
const int, const int, const void *, const void *,
const int, const void *, void *, const int );
PT_TREE_T ATL_Ssyr2k
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const enum ATLAS_TRANS, const int, const int,
const int, const int, const void *, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int );
PT_TREE_T ATL_Strmm
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const void *, const void *,
const int, void *, const int );
PT_TREE_T ATL_Strsm
( const PT_LVL3_TYPE_T *, const unsigned int,
const unsigned int, pthread_attr_t *, const int,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const void *, const void *,
const int, void *, const int );
#if defined( TREAL ) || defined( TCPLX )
int Mjoin( PATL, GetNB ) ( void );
void Mjoin( PATL, ptl3settype ) ( PT_LVL3_TYPE_T * );
void Mjoin( PATL, gemmNN )
( const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
void Mjoin( PATL, gemmNT )
( const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
void Mjoin( PATL, gemmTN )
( const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
#if defined( TCPLX )
void Mjoin( PATL, gemmNC )
( const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
void Mjoin( PATL, gemmCN )
( const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
#endif
PT_FUN_ARG_T Mjoin( PATL, ptgemm0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, ptsymm0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, ptsyr2k0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, ptsyrk0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, pttrmm0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, pttrsm0 ) ( PT_FUN_ARG_T );
#if defined( TCPLX )
PT_FUN_ARG_T Mjoin( PATL, pthemm0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, pther2k0 ) ( PT_FUN_ARG_T );
PT_FUN_ARG_T Mjoin( PATL, ptherk0 ) ( PT_FUN_ARG_T );
#endif
/*
* =====================================================================
* Prototypes for the Level 3 multi-threaded ATLAS BLAS routines
* =====================================================================
*/
PT_TREE_T Mjoin( PATL, ptgemm_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_TRANS, const enum ATLAS_TRANS,
const int, const int, const int, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int );
PT_TREE_T Mjoin( PATL, ptsymm_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const int, const int, const void *, const void *,
const int, const void *, const int, const void *,
void *, const int );
PT_TREE_T Mjoin( PATL, ptsyr2k_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const void *, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int );
int Mjoin( PATL, ptsyr2k0_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const enum ATLAS_TRANS, const int, const int,
const void *, const void *, const int, const void *,
const int, const void *, void *, const int );
PT_TREE_T Mjoin( PATL, ptsyrk_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const void *, const void *,
const int, const void *, void *, const int );
PT_TREE_T Mjoin( PATL, pttrmm_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const void *, const void *,
const int, void *, const int );
PT_TREE_T Mjoin( PATL, pttrsm_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const void *, const void *,
const int, void *, const int );
void Mjoin( PATL, ptgemm )
( const enum ATLAS_TRANS, const enum ATLAS_TRANS,
const int, const int, const int, const SCALAR,
const TYPE *, const int, const TYPE *, const int,
const SCALAR, TYPE *, const int );
void Mjoin( PATL, ptsymm )
( const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const int, const int, const SCALAR, const TYPE *,
const int, const TYPE *, const int, const SCALAR,
TYPE *, const int );
void Mjoin( PATL, ptsyr2k )
( const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const SCALAR, const TYPE *,
const int, const TYPE *, const int, const SCALAR,
TYPE *, const int );
void Mjoin( PATL, ptsyrk )
( const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const SCALAR, const TYPE *,
const int, const SCALAR, TYPE *, const int );
void Mjoin( PATL, pttrmm )
( const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const SCALAR, const TYPE *,
const int, TYPE *, const int );
void Mjoin( PATL, pttrsm )
( const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const enum ATLAS_TRANS, const enum ATLAS_DIAG,
const int, const int, const SCALAR, const TYPE *,
const int, TYPE *, const int );
#if defined( TCPLX )
PT_TREE_T Mjoin( PATL, pthemm_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const int, const int, const void *, const void *,
const int, const void *, const int, const void *,
void *, const int );
PT_TREE_T Mjoin( PATL, pther2k_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const void *, const void *,
const void *, const int, const void *, const int,
const void *, void *, const int );
int Mjoin( PATL, pther2k0_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const enum ATLAS_TRANS, const int, const int,
const void *, const void *, const int, const void *,
const int, const void *, void *, const int );
PT_TREE_T Mjoin( PATL, ptherk_nt )
( const unsigned int, pthread_attr_t *,
const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const void *, const void *,
const int, const void *, void *, const int );
void Mjoin( PATL, pthemm )
( const enum ATLAS_SIDE, const enum ATLAS_UPLO,
const int, const int, const SCALAR, const TYPE *,
const int, const TYPE *, const int, const SCALAR,
TYPE *, const int );
void Mjoin( PATL, pther2k )
( const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const SCALAR, const TYPE *,
const int, const TYPE *, const int, const TYPE,
TYPE *, const int );
void Mjoin( PATL, ptherk )
( const enum ATLAS_UPLO, const enum ATLAS_TRANS,
const int, const int, const TYPE, const TYPE *,
const int, const TYPE, TYPE *, const int );
#endif
#endif
#endif
/*
* End of atlas_ptlvl3.h
*/