Mercurial > octave
diff liboctave/system/lo-sysinfo.cc @ 24714:d2c727a438ab
Add "-blas" and "-lapack" options to "version" (bug #45659).
* lo-sysinfo.h, lo-sysinfo.cc: New files.
* liboctave/system/module.mk: Update.
* sysdep.cc (F__blas_version__, F__lapack_version__): New functions.
* version.m: Accept -blas and -lapack options.
Make options case insensitive.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Thu, 08 Feb 2018 17:15:13 -0500 |
parents | |
children | 078b795c5219 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/system/lo-sysinfo.cc Thu Feb 08 17:15:13 2018 -0500 @@ -0,0 +1,186 @@ +/* + +Copyright (C) 2018 Markus Mützel + +This file is part of Octave. + +Octave is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Octave is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, see +<https://www.gnu.org/licenses/>. + +*/ + +#if defined (HAVE_CONFIG_H) +# include "config.h" +#endif + +#include <sstream> +#include <string> + +#include "f77-fcn.h" +#include "lo-sysinfo.h" +#include "oct-shlib.h" + +// Hack to stringize macro results. +#define xSTRINGIZE(x) #x +#define STRINGIZE(x) xSTRINGIZE(x) + +namespace octave +{ + namespace sys + { + std::string blas_version (void) + { + dynamic_library dyn_libs (""); + + if (! dyn_libs) + return "unknown BLAS"; + + std::string retval; + + // Check for functions that are specific to certain BLAS implementations. + + // FlexiBLAS + typedef void (*flexi_f_type) (int*, int*, int*); + flexi_f_type flexi_f_ptr = reinterpret_cast<flexi_f_type> + (dyn_libs.search ("flexiblas_get_version")); + + if (flexi_f_ptr) + { + int v_major = 0; + int v_minor = 0; + int v_patch = 0; + flexi_f_ptr (&v_major, &v_minor, &v_patch); + + std::ostringstream s; + s << "FlexiBLAS Version " + << v_major << "." << v_minor << "." << v_patch; + + if (! retval.empty ()) + retval += "\n"; + + retval += s.str (); + } + + // OpenBLAS + typedef char * (*open_fcn_type) (void); + open_fcn_type open_f_ptr = reinterpret_cast<open_fcn_type> + (dyn_libs.search ("openblas_get_config")); + + if (open_f_ptr) + { + if (! retval.empty ()) + retval += "\n"; + + retval += "OpenBLAS (config: " + std::string (open_f_ptr ()) + ")"; + } + + // GotoBLAS(2) + if (dyn_libs.search ("gotoblas_profile_init")) + { + if (! retval.empty ()) + retval += "\n"; + + retval += "GotoBLAS(2)"; + } + + // ATLAS + // FIXME: If we are really interested, we could use a pipe to + // redirect the output of "ATL_buildinfo". + if (dyn_libs.search ("ATL_buildinfo")) + { + if (! retval.empty ()) + retval += "\n"; + + retval += "ATLAS"; + } + + // ACML + typedef void (*acml_f_type) (int*, int*, int*); + acml_f_type acml_f_ptr = reinterpret_cast<acml_f_type> + (dyn_libs.search ("acmlversion")); + + if (acml_f_ptr) + { + int v_major = 0; + int v_minor = 0; + int v_patch = 0; + acml_f_ptr (&v_major, &v_minor, &v_patch); + + std::ostringstream s; + s << "ACML BLAS Version " + << v_major << "." << v_minor << "." << v_patch; + + if (! retval.empty ()) + retval += "\n"; + + retval += s.str (); + } + + // Intel MKL + typedef void (*mkl_f_type) (char*, int); + mkl_f_type mkl_f_ptr = reinterpret_cast<mkl_f_type> + (dyn_libs.search ("mkl_get_version_string")); + + if (mkl_f_ptr) + { + char buf[198]; + int len = 198; + mkl_f_ptr (buf, len); + + if (! retval.empty ()) + retval += "\n"; + + retval += std::string (buf); + } + + // Otherwise + if (retval.empty ()) + retval = "unknown or reference BLAS"; + + return retval; + } + + std::string lapack_version (void) + { + std::string retval = "unknown LAPACK"; + + dynamic_library dyn_libs (""); + + if (! dyn_libs) + return retval; + + // query LAPACK version + typedef F77_RET_T + (*ilaver_fcn_type) (const F77_INT&, const F77_INT&, const F77_INT&); + ilaver_fcn_type f_ptr = reinterpret_cast<ilaver_fcn_type> + (dyn_libs.search (STRINGIZE (F77_FUNC (ilaver, ILAVER)))); + + if (f_ptr) + { + int v_major = 0; + int v_minor = 0; + int v_patch = 0; + f_ptr (v_major, v_minor, v_patch); + + std::ostringstream s; + s << "Linear Algebra PACKage Version " + << v_major << "." << v_minor << "." << v_patch; + + retval = s.str (); + } + + return retval; + } + } +}