nopenpilot/third_party/acados/include/blasfeo/include/blasfeo_common.h

237 lines
9.0 KiB
C

/**************************************************************************************************
* *
* This file is part of BLASFEO. *
* *
* BLASFEO -- BLAS For Embedded Optimization. *
* Copyright (C) 2019 by Gianluca Frison. *
* Developed at IMTEK (University of Freiburg) under the supervision of Moritz Diehl. *
* All rights reserved. *
* *
* The 2-Clause BSD License *
* *
* 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 distribution. *
* *
* 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 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 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 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
* Author: Gianluca Frison, gianluca.frison (at) imtek.uni-freiburg.de *
* *
**************************************************************************************************/
#ifndef BLASFEO_COMMON_H_
#define BLASFEO_COMMON_H_
#include "blasfeo_target.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__INTEL_LLVM_COMPILER)
#define ALIGNED(VEC, BYTES) VEC __attribute__ ((aligned ( BYTES )))
#elif defined (_MSC_VER)
#define ALIGNED(VEC, BYTES) __declspec(align( BYTES )) VEC
#else
#define ALIGNED(VEC, BYTES) VEC
#endif
#if ( defined(LA_HIGH_PERFORMANCE) & defined(MF_PANELMAJ) ) | ( defined(LA_REFERENCE) & defined(MF_PANELMAJ) )
#include "blasfeo_block_size.h"
// matrix structure
struct blasfeo_dmat
{
double *mem; // pointer to passed chunk of memory
double *pA; // pointer to a pm*pn array of doubles, the first is aligned to cache line size
double *dA; // pointer to a min(m,n) (or max???) array of doubles
int m; // rows
int n; // cols
int pm; // packed number or rows
int cn; // packed number or cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
struct blasfeo_smat
{
float *mem; // pointer to passed chunk of memory
float *pA; // pointer to a pm*pn array of floats, the first is aligned to cache line size
float *dA; // pointer to a min(m,n) (or max???) array of floats
int m; // rows
int n; // cols
int pm; // packed number or rows
int cn; // packed number or cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
// vector structure
struct blasfeo_dvec
{
double *mem; // pointer to passed chunk of memory
double *pa; // pointer to a pm array of doubles, the first is aligned to cache line size
int m; // size
int pm; // packed size
int memsize; // size of needed memory
};
struct blasfeo_svec
{
float *mem; // pointer to passed chunk of memory
float *pa; // pointer to a pm array of floats, the first is aligned to cache line size
int m; // size
int pm; // packed size
int memsize; // size of needed memory
};
#define BLASFEO_DMATEL(sA,ai,aj) ((sA)->pA[((ai)-((ai)&(D_PS-1)))*(sA)->cn+(aj)*D_PS+((ai)&(D_PS-1))])
#define BLASFEO_SMATEL(sA,ai,aj) ((sA)->pA[((ai)-((ai)&(S_PS-1)))*(sA)->cn+(aj)*S_PS+((ai)&(S_PS-1))])
#define BLASFEO_DVECEL(sa,ai) ((sa)->pa[ai])
#define BLASFEO_SVECEL(sa,ai) ((sa)->pa[ai])
#elif ( defined(LA_HIGH_PERFORMANCE) & defined(MF_COLMAJ) ) | ( defined(LA_REFERENCE) & defined(MF_COLMAJ) ) | defined(LA_EXTERNAL_BLAS_WRAPPER)
// matrix structure
struct blasfeo_dmat
{
double *mem; // pointer to passed chunk of memory
double *pA; // pointer to a m*n array of doubles
double *dA; // pointer to a min(m,n) (or max???) array of doubles
int m; // rows
int n; // cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
struct blasfeo_smat
{
float *mem; // pointer to passed chunk of memory
float *pA; // pointer to a m*n array of floats
float *dA; // pointer to a min(m,n) (or max???) array of floats
int m; // rows
int n; // cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
// vector structure
struct blasfeo_dvec
{
double *mem; // pointer to passed chunk of memory
double *pa; // pointer to a m array of doubles, the first is aligned to cache line size
int m; // size
int memsize; // size of needed memory
};
struct blasfeo_svec
{
float *mem; // pointer to passed chunk of memory
float *pa; // pointer to a m array of floats, the first is aligned to cache line size
int m; // size
int memsize; // size of needed memory
};
#define BLASFEO_DMATEL(sA,ai,aj) ((sA)->pA[(ai)+(aj)*(sA)->m])
#define BLASFEO_SMATEL(sA,ai,aj) ((sA)->pA[(ai)+(aj)*(sA)->m])
#define BLASFEO_DVECEL(sa,ai) ((sa)->pa[ai])
#define BLASFEO_SVECEL(sa,ai) ((sa)->pa[ai])
#else
#error : wrong LA or MF choice
#endif
// Explicitly panel-major matrix structure
struct blasfeo_pm_dmat
{
double *mem; // pointer to passed chunk of memory
double *pA; // pointer to a pm*pn array of doubles, the first is aligned to cache line size
double *dA; // pointer to a min(m,n) (or max???) array of doubles
int m; // rows
int n; // cols
int pm; // packed number or rows
int cn; // packed number or cols
int use_dA; // flag to tell if dA can be used
int ps; // panel size
int memsize; // size of needed memory
};
struct blasfeo_pm_smat
{
float *mem; // pointer to passed chunk of memory
float *pA; // pointer to a pm*pn array of floats, the first is aligned to cache line size
float *dA; // pointer to a min(m,n) (or max???) array of floats
int m; // rows
int n; // cols
int pm; // packed number or rows
int cn; // packed number or cols
int use_dA; // flag to tell if dA can be used
int ps; // panel size
int memsize; // size of needed memory
};
// Explicitly column-major matrix structure
struct blasfeo_cm_dmat
{
double *mem; // pointer to passed chunk of memory
double *pA; // pointer to a m*n array of doubles
double *dA; // pointer to a min(m,n) (or max???) array of doubles
int m; // rows
int n; // cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
struct blasfeo_cm_smat
{
float *mem; // pointer to passed chunk of memory
float *pA; // pointer to a m*n array of floats
float *dA; // pointer to a min(m,n) (or max???) array of floats
int m; // rows
int n; // cols
int use_dA; // flag to tell if dA can be used
int memsize; // size of needed memory
};
#define BLASFEO_PM_DMATEL(sA,ai,aj) ((sA)->pA[((ai)-((ai)&((sA)->ps-1)))*(sA)->cn+(aj)*((sA)->ps)+((ai)&((sA)->ps-1))])
#define BLASFEO_PM_SMATEL(sA,ai,aj) ((sA)->pA[((ai)-((ai)&((sA)->ps-1)))*(sA)->cn+(aj)*((sA)->ps)+((ai)&((sA)->ps-1))])
#define BLASFEO_CM_DMATEL(sA,ai,aj) ((sA)->pA[(ai)+(aj)*(sA)->m])
#define BLASFEO_CM_SMATEL(sA,ai,aj) ((sA)->pA[(ai)+(aj)*(sA)->m])
#ifdef __cplusplus
}
#endif
#endif // BLASFEO_COMMON_H_