/************************************************************************************************** * * * 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_