LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
Namespaces | Classes | Functions | Variables
lsst::base Namespace Reference

Namespaces

namespace  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...
 
class  PythonModuleImporter
 

Functions

std::string libraryExtension ()
 Return filename extension for libraries. More...
 
std::string getLibraryFilename (std::string const &name)
 Get filename for library. More...
 
bool canLoadLibrary (std::string const &libName)
 Return whether we can load a library. More...
 
template<typename T >
T * loadSymbol (std::string const &libName, std::string const &symName)
 Load a symbol from a dynamic library. More...
 
bool haveThreads ()
 Are threaded packages available? More...
 
void setNumThreads (unsigned int numThreads)
 Set number of threads to use. More...
 
unsigned int getNumThreads ()
 Get maximum number of threads we might use. More...
 
bool disableImplicitThreading ()
 Disable threading that has not been set explicitly. More...
 
void installPythonModuleImporter ()
 
 PYBIND11_MODULE (cppimport, mod)
 
 PYBIND11_MODULE (threads, mod)
 

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"
 Environment variable to allow implicit threading. More...
 

Function Documentation

◆ canLoadLibrary()

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_NOW | RTLD_GLOBAL);
40}
std::string getLibraryFilename(std::string const &name)
Get filename for library.
Definition: library.cc:27

◆ disableImplicitThreading()

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{
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}
T c_str(T... args)
T getenv(T... args)
bool const haveOpenBlas
Is OpenBLAS available?
Definition: threads.cc:104
std::string const allowEnvvar
Environment variable to allow implicit threading.
Definition: threads.h:16
bool const haveMkl
Is MKL available?
Definition: threads.cc:105

◆ getLibraryFilename()

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: Amplifier.cc:116
std::string libraryExtension()
Return filename extension for libraries.
Definition: library.cc:17

◆ getNumThreads()

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}
T max(T... args)

◆ haveThreads()

bool lsst::base::haveThreads ( )

Are threaded packages available?

Definition at line 26 of file threads.h.

26{ return haveOpenBlas || haveMkl; }

◆ installPythonModuleImporter()

void lsst::base::installPythonModuleImporter ( )

Definition at line 60 of file cppimport.cc.

60{ ModuleImporter::install(PythonModuleImporter::get()); }

◆ libraryExtension()

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}

◆ loadSymbol()

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_NOW | RTLD_GLOBAL | 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}
Unable to load library.
Definition: library.h:16
#define RTLD_DEEPBIND
Definition: library.h:9

◆ PYBIND11_MODULE() [1/2]

lsst::base::PYBIND11_MODULE ( cppimport  ,
mod   
)

Definition at line 62 of file cppimport.cc.

62 {
64}
void installPythonModuleImporter()
Definition: cppimport.cc:60

◆ PYBIND11_MODULE() [2/2]

lsst::base::PYBIND11_MODULE ( threads  ,
mod   
)

Definition at line 32 of file threads.cc.

32 {
33 mod.def("haveThreads", &lsst::base::haveThreads);
34 mod.def("setNumThreads", &lsst::base::setNumThreads);
35 mod.def("getNumThreads", &lsst::base::getNumThreads);
36 mod.def("disableImplicitThreading", &lsst::base::disableImplicitThreading);
37}
unsigned int getNumThreads()
Get maximum number of threads we might use.
Definition: threads.cc:120
bool disableImplicitThreading()
Disable threading that has not been set explicitly.
Definition: threads.cc:132
bool haveThreads()
Are threaded packages available?
Definition: threads.h:26
void setNumThreads(unsigned int numThreads)
Set number of threads to use.
Definition: threads.cc:107

◆ setNumThreads()

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}
No threading library is available.
Definition: threads.h:20

Variable Documentation

◆ allowEnvvar

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.

◆ haveMkl

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

Is MKL available?

Definition at line 105 of file threads.cc.

◆ haveOpenBlas

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

Is OpenBLAS available?

Definition at line 104 of file threads.cc.