diff --git a/src/classes/PFitter.cpp b/src/classes/PFitter.cpp index 82ea8971..dbc3d50a 100644 --- a/src/classes/PFitter.cpp +++ b/src/classes/PFitter.cpp @@ -32,6 +32,7 @@ #endif #include +#include #ifdef HAVE_GOMP #include @@ -80,10 +81,9 @@ using namespace std; * \param runInfo pointer of the msr-file handler * \param runListCollection pointer of the run list collection (pre-processed historgrams) * \param chisq_only flag: true=calculate chisq only (no fitting) - * \param hardwareInfo string containing CPU/GPU information */ -PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bool_t chisq_only, TString hardwareInfo) : - fChisqOnly(chisq_only), fHardwareInfo(hardwareInfo), fRunInfo(runInfo), fRunListCollection(runListCollection) +PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bool_t chisq_only) : + fChisqOnly(chisq_only), fRunInfo(runInfo), fRunListCollection(runListCollection) { // initialize variables fDKSReady = false; @@ -1756,22 +1756,34 @@ Bool_t PFitter::ExecuteSave(Bool_t firstSave) fout << endl << "*************************************************************************"; fout << endl; - // write CPU/GPU info + // write CPU/GPU info + string hwInfo("??"); + int status=0; switch (fDKSTag) { case DKS_CPU_OPENMP: - fout << endl << " CPU info : " << fHardwareInfo; - fout << endl << " OpenMP" << endl; + fout << endl << " CPU info : " << GetCPUInfo(); +#ifdef HAVE_GOMP + fout << endl << " OpenMP" << endl; +#else + fout << endl << " CPU, i.e. single threaded" << endl; +#endif break; - case DKS_CPU_OPENCL: - fout << endl << " CPU info : " << fHardwareInfo; + case DKS_CPU_OPENCL: + if (fFitterFcnDKS) + status = fFitterFcnDKS->GetDeviceName(hwInfo); + fout << endl << " CPU info : " << hwInfo; fout << endl << " OpenCL" << endl; break; - case DKS_GPU_CUDA: - fout << endl << " GPU info : " << fHardwareInfo; + case DKS_GPU_CUDA: + if (fFitterFcnDKS) + status = fFitterFcnDKS->GetDeviceName(hwInfo); + fout << endl << " GPU info : " << hwInfo; fout << endl << " Cuda" << endl; break; - case DKS_GPU_OPENCL: - fout << endl << " GPU info : " << fHardwareInfo; + case DKS_GPU_OPENCL: + if (fFitterFcnDKS) + status = fFitterFcnDKS->GetDeviceName(hwInfo); + fout << endl << " GPU info : " << hwInfo; fout << endl << " OpenCL" << endl; break; default: @@ -2123,6 +2135,59 @@ Double_t PFitter::MilliTime() return ((Double_t)now.tv_sec * 1.0e6 + (Double_t)now.tv_usec)/1.0e3; } +//-------------------------------------------------------------------------- +// GetCPUInfo (private) +//-------------------------------------------------------------------------- +/** + *

extract CPU information from the system. + * + * @return the CPU information or ?? if this was not possible. + */ +string PFitter::GetCPUInfo() +{ + string cpuInfo = "??"; + + // find out if linux or Mac OS X + struct utsname sys_info; + + uname(&sys_info); + + if (strstr(sys_info.sysname, "Linux")) { + char result[128]; + strcpy(result, "??"); + + char line[128], str[128], *pos; + bool done = false; + ifstream fin("/proc/cpuinfo", ifstream::in); + while (fin.good() && !done) { + fin.getline(line, 128); + if (strstr(line, "model name")) { + pos = strstr(line, ":"); + strcpy(str, pos+2); + strncpy(result, str, sizeof(result)); + done = true; + } + } + fin.close(); + cpuInfo = result; + } else if (strstr(sys_info.sysname, "Darwin")) { + system("sysctl -n machdep.cpu.brand_string >> /tmp/_musrfit_cpu_info.txt"); + sleep(1); + + char line[128], result[128]; + ifstream fin("/tmp/_musrfit_cpu_info.txt", ifstream::in); + while (fin.good()) { + fin.getline(line, 128); + strncat(result, line, sizeof(result) - strlen(result) - 1); + } + fin.close(); + system("rm /tmp/_musrfit_cpu_info.txt"); + cpuInfo = result; + } + + return cpuInfo; +} + //------------------------------------------------------------------------------------------------- // end //------------------------------------------------------------------------------------------------- diff --git a/src/classes/PFitterFcnDKS.cpp b/src/classes/PFitterFcnDKS.cpp index a68b66c6..245b80c1 100644 --- a/src/classes/PFitterFcnDKS.cpp +++ b/src/classes/PFitterFcnDKS.cpp @@ -219,6 +219,29 @@ void PFitterFcnDKS::CalcExpectedChiSquare(const std::vector &par, Doub } } +//-------------------------------------------------------------------------- +// GetDeviceName (public) +//-------------------------------------------------------------------------- +/** + *

get from DKS the device name used. + * + * \param devName deivce name, if status == 0 + * + * \return 0 if OK, 1 otherwise + */ +int PFitterFcnDKS::GetDeviceName(string &devName) +{ + int status = 1; + + devName = "??"; + if (!fValid) + return status; + + status = fDKS.getDeviceName(devName); + + return status; +} + //-------------------------------------------------------------------------- // InitDKS (private) //-------------------------------------------------------------------------- @@ -251,7 +274,7 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) // init chisq buffer on the GPU - // 1) calculated the maximum size for the data needed. + // 1) calculate the maximum size for the data needed. Int_t parSize = -1, mapSize = -1, funSize = -1; Int_t maxSize = 0, size = -1; for (UInt_t i=0; iGetNoOfSingleHisto(); i++) { @@ -296,7 +319,7 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) } // now ready to init the chisq buffer on the GPU - cout << "debug> maximal packed histo size=" << maxSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl; +// cout << "debug> maximal packed histo size=" << maxSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl; ierr = fDKS.initChiSquare(maxSize, parSize, funSize, mapSize); if (ierr != 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocate the necessary chisq buffer on the GPU." << endl; diff --git a/src/include/PFitter.h b/src/include/PFitter.h index a40af326..9c26ce0f 100644 --- a/src/include/PFitter.h +++ b/src/include/PFitter.h @@ -68,7 +68,7 @@ class PFitter { public: - PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bool_t chisq_only = false, TString hardwareInfo = TString("??")); + PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bool_t chisq_only = false); virtual ~PFitter(); Bool_t IsValid() { return fIsValid; } @@ -85,7 +85,6 @@ class PFitter Bool_t fChisqOnly; ///< flag. true: calculate chi^2 only (no fitting). Bool_t fUseChi2; ///< flag. true: chi^2 fit. false: log-max-likelihood UInt_t fPrintLevel; ///< tag, showing the level of messages whished. 0=minimum, 1=standard, 2=maximum - TString fHardwareInfo; ///< string containing the CPU/GPU information. UInt_t fStrategy; ///< fitting strategy (see minuit2 manual). @@ -134,7 +133,9 @@ class PFitter Bool_t ExecuteSave(Bool_t first); Bool_t ExecuteSimplex(); - Double_t MilliTime(); + Double_t MilliTime(); + + string GetCPUInfo(); }; #endif // _PFITTER_H_ diff --git a/src/include/PFitterFcnDKS.h b/src/include/PFitterFcnDKS.h index b2325b97..9168a3e7 100644 --- a/src/include/PFitterFcnDKS.h +++ b/src/include/PFitterFcnDKS.h @@ -58,6 +58,8 @@ class PFitterFcnDKS : public ROOT::Minuit2::FCNBase virtual UInt_t GetTotalNoOfFittedBins() { return fRunListCollection->GetTotalNoOfBinsFitted(); } virtual UInt_t GetNoOfFittedBins(const UInt_t idx) { return fRunListCollection->GetNoOfBinsFitted(idx); } virtual void CalcExpectedChiSquare(const std::vector &par, Double_t &totalExpectedChisq, std::vector &expectedChisqPerRun); + + virtual int GetDeviceName(string &devName); private: Bool_t fValid; ///< flag needed to ensure a valid state diff --git a/src/musrfit.cpp b/src/musrfit.cpp index c8f3e785..e538b6e5 100644 --- a/src/musrfit.cpp +++ b/src/musrfit.cpp @@ -35,7 +35,6 @@ #include //#include #include -#include #include #include #include @@ -122,87 +121,6 @@ void musrfit_syntax() cout << endl << endl; } -//-------------------------------------------------------------------------- -/** - *

extract CPU information from the system. - * - * @return the CPU information or ?? if this was not possible. - */ -TString musrfit_get_cpu_info() -{ - TString cpuInfo = "??"; - - // find out if linux or Mac OS X - struct utsname sys_info; - - uname(&sys_info); - - if (strstr(sys_info.sysname, "Linux")) { - char result[128]; - strcpy(result, "??"); - - char line[128], str[128], *pos; - bool done = false; - ifstream fin("/proc/cpuinfo", ifstream::in); - while (fin.good() && !done) { - fin.getline(line, 128); - if (strstr(line, "model name")) { - pos = strstr(line, ":"); - strcpy(str, pos+2); - strncpy(result, str, sizeof(result)); - done = true; - } - } - fin.close(); - cpuInfo = result; - } else if (strstr(sys_info.sysname, "Darwin")) { - system("sysctl -n machdep.cpu.brand_string >> _musrfit_cpu_info.txt"); - sleep(1); - - char line[128], result[128]; - ifstream fin("_musrfit_cpu_info.txt", ifstream::in); - while (fin.good()) { - fin.getline(line, 128); - strncat(result, line, sizeof(result) - strlen(result) - 1); - } - fin.close(); - system("rm _musrfit_cpu_info.txt"); - cpuInfo = result; - } - - return cpuInfo; -} - -//-------------------------------------------------------------------------- -/** - *

extract GPU information from the system. - * - * @return the GPU information or ?? if this was not possible. - */ -TString musrfit_get_gpu_info() -{ - TString gpuInfo = "??"; - - system("nvidia-smi -L > _nv.txt"); - sleep(1); - - bool done=false; - char line[128]; - ifstream fin("_nv.txt", ifstream::in); - while (fin.good() && !done) { - fin.getline(line, 128); - if (strstr(line, "Tesla")) { - done = true; - } - } - fin.close(); - gpuInfo = line; - - system("rm _nv.txt"); - - return gpuInfo; -} - //-------------------------------------------------------------------------- /** *

Writes the fitted data- and theory-set in ascii format to disc. @@ -694,23 +612,7 @@ int main(int argc, char *argv[]) } return status; } - - // get CPU/GPU information - UInt_t dksTag = msrHandler->GetDKSTag(); - TString hardwareInfo = TString("??"); - switch (dksTag) { - case DKS_CPU_OPENMP: - case DKS_CPU_OPENCL: - hardwareInfo = musrfit_get_cpu_info(); - break; - case DKS_GPU_CUDA: - case DKS_GPU_OPENCL: - hardwareInfo = musrfit_get_gpu_info(); - break; - default: - break; - } - + // read all the necessary runs (raw data) PRunDataHandler *dataHandler; if (startupHandler) @@ -761,7 +663,7 @@ int main(int argc, char *argv[]) // do fitting PFitter *fitter = 0; if (success) { - fitter = new PFitter(msrHandler, runListCollection, chisq_only, hardwareInfo); + fitter = new PFitter(msrHandler, runListCollection, chisq_only); if (fitter->IsValid()) { fitter->DoFit(); if (!fitter->IsScanOnly()) @@ -769,7 +671,7 @@ int main(int argc, char *argv[]) } } - cout << "debug> after fit ..." << endl; +// cout << "debug> after fit ..." << endl; // write log file if (success && !chisq_only) {