LSSTApplications  11.0-13-gbb96280,12.1.rc1,12.1.rc1+1,12.1.rc1+2,12.1.rc1+5,12.1.rc1+8,12.1.rc1-1-g06d7636+1,12.1.rc1-1-g253890b+5,12.1.rc1-1-g3d31b68+7,12.1.rc1-1-g3db6b75+1,12.1.rc1-1-g5c1385a+3,12.1.rc1-1-g83b2247,12.1.rc1-1-g90cb4cf+6,12.1.rc1-1-g91da24b+3,12.1.rc1-2-g3521f8a,12.1.rc1-2-g39433dd+4,12.1.rc1-2-g486411b+2,12.1.rc1-2-g4c2be76,12.1.rc1-2-gc9c0491,12.1.rc1-2-gda2cd4f+6,12.1.rc1-3-g3391c73+2,12.1.rc1-3-g8c1bd6c+1,12.1.rc1-3-gcf4b6cb+2,12.1.rc1-4-g057223e+1,12.1.rc1-4-g19ed13b+2,12.1.rc1-4-g30492a7
LSSTDataManagementBasePackage
Namespaces | Classes | Functions | Variables
lsst::base Namespace Reference

Namespaces

 packages
 
 version
 

Classes

class  LibraryException
 Unable to load library. More...
 
class  ModuleImporter
 Base class that defines an interface for importing Python modules. More...
 
class  NoThreadsException
 No threading library is available. More...
 

Functions

std::string libraryExtension ()
 
std::string getLibraryFilename (std::string const &name)
 
bool canLoadLibrary (std::string const &libName)
 
void setNumThreads (unsigned int numThreads)
 
unsigned int getNumThreads ()
 
bool disableImplicitThreading ()
 
std::string getCfitsioVersion ()
 
std::string getFftwVersion ()
 
std::string getWcslibVersion ()
 
std::string getGslVersion ()
 
std::map< std::string,
std::string > 
getRuntimeVersions ()
 
template<typename T >
T * loadSymbol (std::string const &libName, std::string const &symName)
 
bool haveThreads ()
 Are threaded packages available? More...
 

Variables

bool const haveOpenBlas = loadOpenBlas()
 Is OpenBLAS available? More...
 
bool const haveMkl = loadMkl()
 Is MKL available? More...
 
std::string const allowEnvvar = "LSST_ALLOW_IMPLICIT_THREADS"
 

Function Documentation

bool lsst::base::canLoadLibrary ( std::string const &  libName)

Return whether we can load a library

The proper filename extension will be added to the library name unless one is specified.

Parameters
libNameLibrary name

Definition at line 37 of file library.cc.

38 {
39  return dlopen(getLibraryFilename(libName).c_str(), RTLD_LAZY | RTLD_GLOBAL);
40 }
std::string getLibraryFilename(std::string const &name)
Definition: library.cc:27
bool lsst::base::disableImplicitThreading ( )

Disable threading that has not been set explicitly

Some threaded packages implicitly use multiple threads if the user doesn't explicitly state the number of desired threads. However, this can interfere with operations that are parallelised at a higher level. This function will disable threading unless the user has explicitly specified the number of desired threads through environment variables.

This behavior may be disabled by setting the environment variable specified by allowEnvvar.

This is principally intended for Linux machines (we explicitly load .so dynamic libraries); MacOS has its own way of doing threading (Grand Central Dispatch) that throttles threads to avoid overwhelming the machine.

@ return whether we disabled threading

Definition at line 132 of file threads.cc.

133 {
134  if (std::getenv(allowEnvvar.c_str())) {
135  return false; // The user knows what he's doing; no intervention performed
136  }
137 
138  bool intervened = false; // Did we intervene on behalf of the user?
139  if (haveOpenBlas) {
140  intervened |= disableImplicitThreadingImpl(
141  "OpenBLAS",
142  {"OPENBLAS_NUM_THREADS", "GOTO_NUM_THREADS", "OMP_NUM_THREADS"},
143  getOpenBlasThreads,
144  setOpenBlasThreads
145  );
146  }
147  if (haveMkl) {
148  intervened |= disableImplicitThreadingImpl(
149  "MKL",
150  {"MKL_NUM_THREADS", "MKL_DOMAIN_NUM_THREADS", "OMP_NUM_THREADS"},
151  getMklThreads,
152  setMklThreads
153  );
154  }
155  return intervened;
156 }
bool const haveMkl
Is MKL available?
Definition: threads.h:11
std::string const allowEnvvar
Definition: threads.h:16
bool const haveOpenBlas
Is OpenBLAS available?
Definition: threads.h:10
std::string lsst::base::getCfitsioVersion ( )

Definition at line 26 of file versions.cc.

27 {
28  typedef float (GetVersion)(float*);
29  float version;
30  loadSymbol<GetVersion>("libcfitsio", "ffvers")(&version);
31 
32  std::stringstream ss(std::stringstream::in | std::stringstream::out);
33  ss << version;
34  return ss.str();
35 }
std::string lsst::base::getFftwVersion ( )

Definition at line 37 of file versions.cc.

38 {
39  return std::string(loadSymbol<char const>("libfftw3", "fftw_version"));
40 }
std::string lsst::base::getGslVersion ( )

Definition at line 48 of file versions.cc.

49 {
50  return std::string(*loadSymbol<char const*>("libgsl", "gsl_version"));
51 }
std::string lsst::base::getLibraryFilename ( std::string const &  name)

Get filename for library

We'll add the typical filename extension for the platform unless the user specifies a ".so" or ".dylib" extension.

Definition at line 27 of file library.cc.

28 {
29  if (endsWith(name, ".so") || endsWith(name, ".dylib")) {
30  // User asked for a library with a certain extension, so give it to them
31  return name;
32  }
33  return name + libraryExtension();
34 }
table::Key< std::string > name
Definition: ApCorrMap.cc:71
std::string libraryExtension()
Definition: library.cc:17
unsigned int lsst::base::getNumThreads ( )

Get maximum number of threads we might use

Returns the maximum value of the number of threads being used by the threading libraries that are available.

Definition at line 120 of file threads.cc.

121 {
122  unsigned int numThreads = 0;
123  if (haveOpenBlas) {
124  numThreads = std::max(numThreads, static_cast<unsigned int>(getOpenBlasThreads()));
125  }
126  if (haveMkl) {
127  numThreads = std::max(numThreads, static_cast<unsigned int>(getMklThreads()));
128  }
129  return numThreads;
130 }
bool const haveMkl
Is MKL available?
Definition: threads.h:11
bool const haveOpenBlas
Is OpenBLAS available?
Definition: threads.h:10
std::map< std::string, std::string > lsst::base::getRuntimeVersions ( )

Return version strings for dependencies

It is not clever, and only returns versions of packages declared in an internal list.

Returns a map of product:version.

Definition at line 54 of file versions.cc.

55 {
56  std::map<std::string, std::string> versions;
57  for (auto&& pkg : packages) {
58  try {
59  versions[pkg.first] = pkg.second();
60  } catch (LibraryException const&) {
61  // Can't find the module, so ignore it
62  }
63  }
64  return versions;
65 }
std::string lsst::base::getWcslibVersion ( )

Definition at line 42 of file versions.cc.

43 {
44  typedef char const* (GetVersion)(int[]);
45  return std::string(loadSymbol<GetVersion>("libwcs", "wcslib_version")(NULL));
46 }
bool lsst::base::haveThreads ( )

Are threaded packages available?

Definition at line 26 of file threads.h.

26 { return haveOpenBlas || haveMkl; }
bool const haveMkl
Is MKL available?
Definition: threads.h:11
bool const haveOpenBlas
Is OpenBLAS available?
Definition: threads.h:10
std::string lsst::base::libraryExtension ( )

Return filename extension for libraries

Typically ".so" for Linux and ".dylib" for Mac.

Definition at line 17 of file library.cc.

18 {
19 #ifdef __APPLE__
20  return ".dylib";
21 #else
22  return ".so";
23 #endif
24 }
template<typename T >
T* lsst::base::loadSymbol ( std::string const &  libName,
std::string const &  symName 
)

Load a symbol from a dynamic library

The proper filename extension will be added to the library name unless one is specified.

No mangling is performed on the symbol name.

Parameters
libNameLibrary name (NOT including ".so" or ".dylib")
symNameSymbol name

Definition at line 51 of file library.h.

55 {
56  void* lib = dlopen(getLibraryFilename(libName).c_str(), RTLD_LAZY | RTLD_DEEPBIND);
57  if (!lib) {
58  throw LibraryException(libName);
59  }
60 
61  T* sym;
62  (void*&)sym = dlsym(lib, symName.c_str());
63  if (!sym) {
64  throw LibraryException(libName, symName);
65  }
66  return sym;
67 }
std::string getLibraryFilename(std::string const &name)
Definition: library.cc:27
#define RTLD_DEEPBIND
Definition: library.h:9
void lsst::base::setNumThreads ( unsigned int  numThreads)

Set number of threads to use

Exceptions
NoThreadsExceptionif no threading library is available

Definition at line 107 of file threads.cc.

108 {
109  if (!haveOpenBlas && !haveMkl && numThreads != 0 && numThreads != 1) {
110  throw NoThreadsException();
111  }
112  if (haveOpenBlas) {
113  setOpenBlasThreads(numThreads);
114  }
115  if (haveMkl) {
116  setMklThreads(numThreads);
117  }
118 }
bool const haveMkl
Is MKL available?
Definition: threads.h:11
bool const haveOpenBlas
Is OpenBLAS available?
Definition: threads.h:10

Variable Documentation

std::string const lsst::base::allowEnvvar = "LSST_ALLOW_IMPLICIT_THREADS"

Environment variable to allow implicit threading

Used by disableImplicitThreading.

Definition at line 16 of file threads.h.

bool const lsst::base::haveMkl = loadMkl()

Is MKL available?

Definition at line 11 of file threads.h.

bool const lsst::base::haveOpenBlas = loadOpenBlas()

Is OpenBLAS available?

Definition at line 10 of file threads.h.