// matrix/kaldi-blas.h // Copyright 2009-2011 Ondrej Glembek; Microsoft Corporation // See ../../COPYING for clarification regarding multiple authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED // WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, // MERCHANTABLITY OR NON-INFRINGEMENT. // See the Apache 2 License for the specific language governing permissions and // limitations under the License. #ifndef KALDI_MATRIX_KALDI_BLAS_H_ #define KALDI_MATRIX_KALDI_BLAS_H_ // This file handles the #includes for BLAS, LAPACK and so on. // It manipulates the declarations into a common format that kaldi can handle. // However, the kaldi code will check whether HAVE_ATLAS is defined as that // code is called a bit differently from CLAPACK that comes from other sources. // There are three alternatives: // (i) you have ATLAS, which includes the ATLAS implementation of CBLAS // plus a subset of CLAPACK (but with clapack_ in the function declarations). // In this case, define HAVE_ATLAS and make sure the relevant directories are // in the include path. // (ii) you have CBLAS (some implementation thereof) plus CLAPACK. // In this case, define HAVE_CLAPACK. // [Since CLAPACK depends on BLAS, the presence of BLAS is implicit]. // (iii) you have the MKL library, which includes CLAPACK and CBLAS. // Note that if we are using ATLAS, no Svd implementation is supplied, // so we define HAVE_Svd to be zero and this directs our implementation to // supply its own "by hand" implementation which is based on TNT code. #if (defined(HAVE_CLAPACK) && (defined(HAVE_ATLAS) || defined(HAVE_MKL))) \ || (defined(HAVE_ATLAS) && defined(HAVE_MKL)) #error "Do not define more than one of HAVE_CLAPACK, HAVE_ATLAS and HAVE_MKL" #endif #ifdef HAVE_ATLAS extern "C" { #include "cblas.h" #include "clapack.h" } #elif defined(HAVE_CLAPACK) #ifdef __APPLE__ #ifndef __has_extension #define __has_extension(x) 0 #endif #define vImage_Utilities_h #define vImage_CVUtilities_h #include typedef __CLPK_integer integer; typedef __CLPK_logical logical; typedef __CLPK_real real; typedef __CLPK_doublereal doublereal; typedef __CLPK_complex complex; typedef __CLPK_doublecomplex doublecomplex; typedef __CLPK_ftnlen ftnlen; #else extern "C" { // May be in /usr/[local]/include if installed; else this uses the one // from the tools/CLAPACK_include directory. #include #include #include // get rid of macros from f2c.h -- these are dangerous. #undef abs #undef dabs #undef min #undef max #undef dmin #undef dmax #undef bit_test #undef bit_clear #undef bit_set } #endif #elif defined(HAVE_MKL) extern "C" { #include } #elif defined(HAVE_OPENBLAS) // getting cblas.h and lapacke.h from /. // putting in "" not <> to search -I before system libraries. #include "cblas.h" #include "lapacke.h" #undef I #undef complex // get rid of macros from f2c.h -- these are dangerous. #undef abs #undef dabs #undef min #undef max #undef dmin #undef dmax #undef bit_test #undef bit_clear #undef bit_set #else #error "You need to define (using the preprocessor) either HAVE_CLAPACK or HAVE_ATLAS or HAVE_MKL (but not more than one)" #endif #ifdef HAVE_OPENBLAS typedef int KaldiBlasInt; // try int. #endif #ifdef HAVE_CLAPACK typedef integer KaldiBlasInt; #endif #ifdef HAVE_MKL typedef MKL_INT KaldiBlasInt; #endif #ifdef HAVE_ATLAS // in this case there is no need for KaldiBlasInt-- this typedef is only needed // for Svd code which is not included in ATLAS (we re-implement it). #endif #endif // KALDI_MATRIX_KALDI_BLAS_H_