Logo ROOT  
Reference Guide
Initialisation.cxx
Go to the documentation of this file.
1/*
2 * Project: RooFit
3 * Authors:
4 * Emmanouil Michalainas, CERN, December 2018
5 *
6 * Copyright (c) 2021, CERN
7 *
8 * Redistribution and use in source and binary forms,
9 * with or without modification, are permitted according to the terms
10 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)
11 */
12
13#include "RooBatchCompute.h"
14
15#include "TEnv.h"
16#include "TSystem.h"
17#include "TError.h"
18
19#include <string>
20#include <exception>
21
22// First initialisation of the pointers. When implementations of the batch compute library
23// are loaded, they will overwrite the pointers.
26
27namespace {
28
29/// Dynamically load a library and throw exception in case of failure
30void loadWithErrorChecking(const std::string &libName)
31{
32 const auto returnValue = gSystem->Load(libName.c_str());
33 if (returnValue == -1 || returnValue == -2)
34 throw std::runtime_error("RooFit was unable to load its computation library " + libName);
35 else if (returnValue == 1) // Library should not have been loaded before we tried to do it.
36 throw std::logic_error("RooFit computation library " + libName +
37 " was loaded before RooFit initialisation began.");
38}
39
40} // end anonymous namespace
41
42namespace RooBatchCompute {
43
44/// Inspect hardware capabilities, and load the optimal library for RooFit computations.
45void init()
46{
47 // Check if the library was not initialised already
48 static bool isInitialised = false;
49 if (isInitialised)
50 return;
51 isInitialised = true;
52
53 const std::string userChoice = gEnv->GetValue("RooFit.BatchCompute", "auto");
54#ifdef R__RF_ARCHITECTURE_SPECIFIC_LIBS
55#ifdef R__HAS_CUDA
56 if(gSystem->Load("libRooBatchCompute_CUDA") != 0) {
58 }
59#endif // R__HAS_CUDA
60
61 __builtin_cpu_init();
62#if __GNUC__ > 5 || defined(__clang__)
63 bool supported_avx512 = __builtin_cpu_supports("avx512cd") && __builtin_cpu_supports("avx512vl") &&
64 __builtin_cpu_supports("avx512bw") && __builtin_cpu_supports("avx512dq");
65#else
66 bool supported_avx512 = false;
67#endif
68
69 if (userChoice == "auto") {
70 if (supported_avx512)
71 loadWithErrorChecking("libRooBatchCompute_AVX512");
72 else if (__builtin_cpu_supports("avx2"))
73 loadWithErrorChecking("libRooBatchCompute_AVX2");
74 else if (__builtin_cpu_supports("avx"))
75 loadWithErrorChecking("libRooBatchCompute_AVX");
76 else if (__builtin_cpu_supports("sse4.1"))
77 loadWithErrorChecking("libRooBatchCompute_SSE4.1");
78 } else if (userChoice == "avx512")
79 loadWithErrorChecking("libRooBatchCompute_AVX512");
80 else if (userChoice == "avx2")
81 loadWithErrorChecking("libRooBatchCompute_AVX2");
82 else if (userChoice == "avx")
83 loadWithErrorChecking("libRooBatchCompute_AVX");
84 else if (userChoice == "sse")
85 loadWithErrorChecking("libRooBatchCompute_SSE4.1");
86 else if (userChoice != "generic")
87 throw std::invalid_argument(
88 "Supported options for `RooFit.BatchCompute` are `auto`, `avx512`, `avx2`, `avx`, `sse`, `generic`.");
89#endif // R__RF_ARCHITECTURE_SPECIFIC_LIBS
90
91 if (RooBatchCompute::dispatchCPU == nullptr)
92 loadWithErrorChecking("libRooBatchCompute_GENERIC");
93}
94
95} // namespace RooBatchCompute
R__EXTERN TEnv * gEnv
Definition: TEnv.h:170
R__EXTERN TSystem * gSystem
Definition: TSystem.h:559
The interface which should be implemented to provide optimised computation functions for implementati...
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition: TEnv.cxx:491
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition: TSystem.cxx:1855
Namespace for dispatching RooFit computations to various backends.
R__EXTERN RooBatchComputeInterface * dispatchCUDA
R__EXTERN RooBatchComputeInterface * dispatchCPU
This dispatch pointer points to an implementation of the compute library, provided one has been loade...
void init()
Inspect hardware capabilities, and load the optimal library for RooFit computations.