early release of the multi threaded Crusher and minor fixes

This commit is contained in:
Balázs Gyöngyösi 2018-01-23 20:10:54 +01:00
parent a4ef471926
commit bc6cb23d47
7 changed files with 219 additions and 40 deletions

View File

@ -71,7 +71,7 @@ int main(int argc, char* argv[])
rat=0.9;
percent = 0.99;
nGenerated = 8000;
nGenerated = 4000;
nop = 30;
vis = 1;
@ -114,7 +114,10 @@ int main(int argc, char* argv[])
Plotter* myPlotter = new Plotter(vis==1);
myPlotter->Plot(nRuns, nSteps, myBM1DProcess->GetT(), myBM1DProcess->GetX());
Draw2D *myDraw2D = new Draw2D(nop, percent, nGenerated, myBM1DProcess->GetT(), myBM1DProcess->GetX()); //nop percent nruns
//int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
//std::cout <<"cpus:"<<numCPU <<std::endl;
Draw2D *myDraw2D = new Draw2D(nop, percent, nGenerated, myBM1DProcess->GetT(), myBM1DProcess->GetX(),2); //nop percent nruns
switch(random_type){
case 'g' :

View File

@ -39,7 +39,7 @@ int main(int argc, char* argv[])
{
//default runs with less parameters
random_type = 'g';
nSteps = 1000;
nSteps = 100;
nRuns = 1;
p0 = 0.5;
p1 = 0;

View File

@ -6,21 +6,27 @@
#include <cmath>
#include <vector>
#include <pthread.h>
#include "Analyse.hh"
#include "Lattice.hh"
#include "Crusher.hh"
#include "Plotter.hh"
#include "Draw2DWorkerThread.hh"
#include "TH2.h"
#include "TCanvas.h"
#include "TGraph.h"
class Draw2D
{
public:
Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp);
Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp, int nThreads_);
~Draw2D();
void Histo2D();
@ -30,6 +36,8 @@ class Draw2D
std::vector<Double_t> x;
int nRuns;
int nThreads;
Analyse *myAnalyse;
Crusher *myCrusher;
Lattice *myLattice;
@ -39,5 +47,7 @@ class Draw2D
TH2D *BM1D_histo2;
TGraph *gr;
struct graphArray graphArray;
};

View File

@ -0,0 +1,71 @@
#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <cmath>
#include <vector>
#include <pthread.h>
#include "Lattice.hh"
#include "Crusher.hh"
#include "TH2.h"
#include "TCanvas.h"
#include "TGraph.h"
typedef void * (*THREADFUNCPTR)(void *);
struct graphArray
{
double *X;
double *Y;
int size;
};
class Draw2DWorkerThread
{
public:
Draw2DWorkerThread(int jobOffset_, int jobSize_, std::vector<Double_t> x_, std::vector<Double_t> t_, int nRuns_, Lattice *myLattice_, TH2D *BM1D_histo_, TH2D *BM1D_histo2_, struct graphArray graphArray_, pthread_mutex_t *histoMutex_);
~Draw2DWorkerThread();
void WorkerFunction();
private:
//output histo pointers
TH2D *BM1D_histo;
TH2D *BM1D_histo2;
//lattice instance pointer
Lattice *myLattice;
int nRuns; //Chrusher parameter number of tested "kukac"
std::vector<Double_t> t; //original "kukac"
std::vector<Double_t> x;
Crusher *myCrusher;
pthread_mutex_t *histoMutex;
//lattice parameters
double XbinSize;
double YbinSize;
double XbinSizePer2;
double YbinSizePer2;
int latticeHeight;
int latticeWidth;
double latticeMuMin;
double latticeSigmaMin;
int jobOffset;
int jobSize;
struct graphArray graphArray;
};

View File

@ -1,17 +1,17 @@
#include "Draw2D.hh"
Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp) //int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp
Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp, int nThreads_) //int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp
{
t = tp;
x = xp;
nRuns = nRunsp;
nThreads = nThreads_;
myAnalyse = new Analyse();
myAnalyse -> AnalyseGaus(t,x);
myCrusher = new Crusher(t,x);
myLattice = new Lattice();
myLattice -> SetNop(nop);
@ -25,7 +25,12 @@ Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, st
BM1D_histo = new TH2D("BM1D_histo", "BM1D_histo", myLattice -> GetWidth() , myLattice -> GetMuMin(), (myLattice -> GetMuMax()) , myLattice -> GetHeight() , myLattice -> GetSigmaMin(), (myLattice -> GetSigmaMax()) );
BM1D_histo2 = new TH2D("BM1D_histo2", "BM1D_histo2", myLattice -> GetWidth() , myLattice -> GetMuMin(), (myLattice -> GetMuMax()) , myLattice -> GetHeight() , myLattice -> GetSigmaMin(), (myLattice -> GetSigmaMax()) );
gr = new TGraph();
graphArray.size = myLattice -> GetLatticeSize();
graphArray.X = new double[graphArray.size];
graphArray.Y = new double[graphArray.size];
gr = new TGraph(graphArray.size);
delete myAnalyse;
}
@ -44,47 +49,69 @@ Draw2D::~Draw2D()
delete gr;
delete myLattice;
delete myCrusher;
delete[] graphArray.X;
delete[] graphArray.Y;
}
void Draw2D::Histo2D()
{
double XbinSize = (myLattice -> GetMuMax() - myLattice -> GetMuMin())/ myLattice -> GetWidth() ;
double YbinSize =( myLattice -> GetSigmaMax() - myLattice -> GetSigmaMin() ) / myLattice -> GetHeight();
double graphArrayX[myLattice -> GetLatticeSize()] = {};
double graphArrayY[myLattice -> GetLatticeSize()] = {};
std::cout << "maxSigma:" << myLattice -> GetSigmaMax() << std::endl;
std::cout << "maxMu:" << myLattice -> GetMuMax() << std::endl;
std::cout << "minSigma:" << myLattice -> GetSigmaMin() << std::endl;
std::cout << "minMu:" << myLattice -> GetMuMin() << std::endl;
for(int i = 0; i < (myLattice -> GetLatticeSize()); i++)
{
std::cout<<"progress: "<<i<<"/"<<myLattice -> GetLatticeSize()<<"point\n";
if(myCrusher -> RunMachine(nRuns, myLattice -> GetMuSigma(i)))
{
BM1D_histo -> Fill((i / myLattice -> GetHeight()) * XbinSize + (XbinSize/2) + myLattice -> GetMuMin(),(i % myLattice -> GetHeight()) * YbinSize + (YbinSize/2) + myLattice -> GetSigmaMin() );
BM1D_histo2 -> Fill((i / myLattice -> GetHeight()) * XbinSize + (XbinSize/2) + myLattice -> GetMuMin(),(i % myLattice -> GetHeight()) * YbinSize + (YbinSize/2) + myLattice -> GetSigmaMin());
graphArrayX[i] = (i / myLattice -> GetHeight()) * XbinSize;
graphArrayY[i] = (i % myLattice -> GetHeight()) * YbinSize;
}
}
pthread_t thread[2];
Draw2DWorkerThread *worker[2];
pthread_attr_t attr;
pthread_mutex_t histoMutex;
pthread_mutex_init(&histoMutex, NULL);
int rc;
void *status;
worker[0] = new Draw2DWorkerThread(0, (myLattice -> GetLatticeSize()/2), x, t, nRuns, myLattice, BM1D_histo, BM1D_histo2, graphArray, &histoMutex);
worker[1] = new Draw2DWorkerThread((myLattice -> GetLatticeSize()/2), (myLattice -> GetLatticeSize()/2), x, t, nRuns, myLattice, BM1D_histo, BM1D_histo2, graphArray, &histoMutex);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for(int i=0; i<2; i++)
{
std::cout<<"creating thread:"<<i<<std::endl;
rc = pthread_create(&thread[i], &attr, (THREADFUNCPTR) &Draw2DWorkerThread::WorkerFunction, (void *)worker[i]);
if (rc)
{
std::cout<<"ERROR; pthread:"<<i<<"create failed!"<<std::endl;
exit(-1);
}
}
pthread_attr_destroy(&attr);
for(int i=0; i<2; i++)
{
rc = pthread_join(thread[i], &status);
if (rc)
{
std::cout<<"ERROR; pthread:"<<i<<"join failed!"<<std::endl;
exit(-1);
}
}
std::cout << "RunMachine done" << std::endl;
//TGraph *gr = new TGraph(myLattice -> GetLatticeSize(),graphArrayX,graphArrayY);
gr -> SetMarkerColor(46);
canvasB2 -> cd();
//gr -> LineStyle()
gr -> DrawGraph(myLattice -> GetLatticeSize(),graphArrayX,graphArrayY,"AP*");
gr -> DrawGraph(graphArray.size, graphArray.X, graphArray.Y, "AP*");
BM1D_histo -> SetMarkerStyle(kFullCircle);
BM1D_histo-> SetMarkerStyle(21);
@ -94,5 +121,6 @@ void Draw2D::Histo2D()
canvasB -> cd(2);
BM1D_histo2 -> Draw("COLZ");
std::cout << "Histo done" << std::endl;
}
std::cout << "Histo draw done" << std::endl;
}

67
src/Draw2DWorkerThread.cc Normal file
View File

@ -0,0 +1,67 @@
#include "Draw2DWorkerThread.hh"
Draw2DWorkerThread::Draw2DWorkerThread(int jobOffset_, int jobSize_, std::vector<Double_t> x_, std::vector<Double_t> t_, int nRuns_, Lattice *myLattice_, TH2D *BM1D_histo_, TH2D *BM1D_histo2_, struct graphArray graphArray_, pthread_mutex_t *histoMutex_)
{
std::cout << "Draw2DWorkerThread::Draw2DWorkerThread" <<std::endl;
//copy to private variables
x = x_;
t = t_;
myLattice = myLattice_;
BM1D_histo = BM1D_histo_;
BM1D_histo2 =BM1D_histo2_;
graphArray = graphArray_;
nRuns = nRuns_;
histoMutex = histoMutex_;
jobOffset = jobOffset_;
jobSize = jobSize_;
//create Crusher instance
myCrusher = new Crusher(t,x);
//calculate lattice parameters TODO rework lattice class!!
XbinSize = (myLattice -> GetMuMax() - myLattice -> GetMuMin())/ myLattice -> GetWidth() ;
YbinSize =( myLattice -> GetSigmaMax() - myLattice -> GetSigmaMin() ) / myLattice -> GetHeight();
XbinSizePer2 = XbinSize/2;
YbinSizePer2 = YbinSize/2;
latticeHeight = myLattice -> GetHeight();
latticeWidth = myLattice -> GetWidth();
latticeMuMin = myLattice -> GetMuMin();
latticeSigmaMin = myLattice -> GetSigmaMin();
}
Draw2DWorkerThread::~Draw2DWorkerThread()
{
delete myCrusher;
}
void Draw2DWorkerThread::WorkerFunction()
{
std::cout << "Draw2DWorkerThread::WorkerFunction" <<std::endl;
std::cout << "jobOffset:"<< jobOffset<< "jobSize:" << jobSize <<std::endl;
for(int i = jobOffset; i < (jobOffset + jobSize); i++)
{
std::cout<<"progress: "<<i<<"/"<<myLattice -> GetLatticeSize()<<"point\n";
if(myCrusher -> RunMachine(nRuns, myLattice -> GetMuSigma(i)))
{
pthread_mutex_lock (histoMutex); //fill histo thread safe???
BM1D_histo ->Fill((i / latticeHeight) * XbinSize + XbinSizePer2 + latticeMuMin, (i % latticeHeight) * YbinSize + YbinSizePer2 + latticeSigmaMin );
BM1D_histo2 ->Fill((i / latticeHeight) * XbinSize + XbinSizePer2 + latticeMuMin, (i % latticeHeight) * YbinSize + YbinSizePer2 + latticeSigmaMin );
graphArray.X[i] = (i / latticeHeight) * XbinSize;
graphArray.Y[i] = (i % latticeHeight)* YbinSize;
pthread_mutex_unlock (histoMutex);
}
}
pthread_exit((void*) 0); //kell?? vagy NULL??
}

View File

@ -105,7 +105,7 @@ void Lattice::SetLattice(Double_t mu_est, Double_t sigma_est){
ms_vect[i].mu = loc_mu;
ms_vect[i].sigma = loc_sigma;
std::cout << "i : " << ms_vect[i].mu << " " << ms_vect[i].sigma << std::endl;
//std::cout << "i : " << ms_vect[i].mu << " " << ms_vect[i].sigma << std::endl;
i++;
loc_sigma += ds;