Skip to content

Commit

Permalink
Merge pull request #6114 from sviret/TrackFindingAM_SV_301014
Browse files Browse the repository at this point in the history
AM PR optimisation
  • Loading branch information
cmsbuild committed Nov 6, 2014
2 parents 8740f27 + b29dc6e commit ed15367
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 36 deletions.
12 changes: 12 additions & 0 deletions L1Trigger/TrackFindingAM/interface/PatternTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,27 @@ class PatternTree{
**/
bool checkPattern(Pattern* lp, Pattern* hp);

/**
\brief Replace the internal map of patterns with a vector of patterns (reduces memory consumption).
\brief If a method searching for a pattern is called, we will automatically switch back to a map.
**/
void switchToVector();

private:
map<string, PatternTrunk*> patterns;
vector<PatternTrunk*> v_patterns;

/**
\brief Add a pattern and update de DC bits if necessary
\param ldp The pattern to add
**/
void addPatternForMerging(GradedPattern* ldp);

/**
\brief Update the internal map and clear the internal vector
**/
void switchToMap();

friend class boost::serialization::access;

template<class Archive> void save(Archive & ar, const unsigned int version) const{
Expand Down
6 changes: 4 additions & 2 deletions L1Trigger/TrackFindingAM/interface/PatternTrunk.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,14 @@ class PatternTrunk{
friend class boost::serialization::access;

template<class Archive> void save(Archive & ar, const unsigned int version) const{
ar << lowDefPattern;;
ar << lowDefPattern;
ar << fullDefPatterns;
}

template<class Archive> void load(Archive & ar, const unsigned int version){
ar >> lowDefPattern;;
if(lowDefPattern!=NULL)
delete lowDefPattern;
ar >> lowDefPattern;
ar >> fullDefPatterns;
}

Expand Down
2 changes: 1 addition & 1 deletion L1Trigger/TrackFindingAM/interface/SectorTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class SectorTree{

private:
multimap<string, Sector*> sectors;
bool mapNeedsUpdate;
vector<Sector*> sector_list;
/**
\brief used to know the superstrip size used for the patterns contained in this sectorTree.
Expand All @@ -53,7 +54,6 @@ class SectorTree{
template<class Archive> void load(Archive & ar, const unsigned int version){
ar >> sector_list;
ar >> superStripSize;
updateSectorMap();
}

BOOST_SERIALIZATION_SPLIT_MEMBER()
Expand Down
6 changes: 6 additions & 0 deletions L1Trigger/TrackFindingAM/src/PatternFinder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ PatternFinder::PatternFinder(int sp, int at, SectorTree* st, string f, string of
eventsFilename = f;
outputFileName = of;

//we don't need the map of patterns, a vector will be enough and uses less memory
sectors->getAllSectors()[0]->getPatternTree()->switchToVector();

map< int, vector<int> > detector_config = Sector::readConfig("detector.cfg");

//We add the layers corresponding to the sectors structure
Expand Down Expand Up @@ -40,6 +43,9 @@ PatternFinder::PatternFinder(int sp, int at, SectorTree* st, string f, string of
d_p_bank = p;
d_parameters = dp;

//we don't need the map of patterns, a vector will be enough and uses less memory
sectors->getAllSectors()[0]->getPatternTree()->switchToVector();

//we use 1024 threads and want to compute the number of blocks
int nb_patterns = sectors->getAllSectors()[0]->getLDPatternNumber();
nb_threads = 1024;
Expand Down
187 changes: 158 additions & 29 deletions L1Trigger/TrackFindingAM/src/PatternTree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,23 @@ PatternTree::PatternTree(){
}

PatternTree::~PatternTree(){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
delete (itr->second);
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
delete (itr->second);
}
patterns.clear();
}
if(v_patterns.size()!=0){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
delete (*itr);
}
v_patterns.clear();
}
}

void PatternTree::addPattern(Pattern* ldp, Pattern* fdp){
if(patterns.size()==0)
switchToMap();
string key = ldp->getKey();
map<string, PatternTrunk*>::iterator it = patterns.find(key);
if(it==patterns.end()){//not found
Expand All @@ -23,6 +34,8 @@ void PatternTree::addPattern(Pattern* ldp, Pattern* fdp){
}

void PatternTree::addPattern(Pattern* ldp, Pattern* fdp, float new_pt){
if(patterns.size()==0)
switchToMap();
string key = ldp->getKey();
map<string, PatternTrunk*>::iterator it = patterns.find(key);
if(it==patterns.end()){//not found
Expand All @@ -35,20 +48,53 @@ void PatternTree::addPattern(Pattern* ldp, Pattern* fdp, float new_pt){
}
}

void PatternTree::switchToVector(){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
v_patterns.push_back(itr->second);
}
patterns.clear();
}

void PatternTree::switchToMap(){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
GradedPattern* gp = (*itr)->getLDPattern();
string key = gp->getKey();
patterns[key]=*itr;
delete gp;
}
v_patterns.clear();
}

vector<GradedPattern*> PatternTree::getFDPatterns(){
vector<GradedPattern*> res;
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
vector<GradedPattern*> fdp = itr->second->getFDPatterns();
res.insert(res.end(), fdp.begin(), fdp.end());
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
vector<GradedPattern*> fdp = itr->second->getFDPatterns();
res.insert(res.end(), fdp.begin(), fdp.end());
}
}
if(v_patterns.size()!=0){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
vector<GradedPattern*> fdp = (*itr)->getFDPatterns();
res.insert(res.end(),fdp.begin(),fdp.end());
}
}
return res;
}

vector<GradedPattern*> PatternTree::getLDPatterns(){
vector<GradedPattern*> res;
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
GradedPattern* ldp = itr->second->getLDPattern();
res.push_back(ldp);
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
GradedPattern* ldp = itr->second->getLDPattern();
res.push_back(ldp);
}
}
if(v_patterns.size()!=0){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
GradedPattern* ldp = (*itr)->getLDPattern();
res.push_back(ldp);
}
}
return res;
}
Expand All @@ -58,51 +104,130 @@ vector<int> PatternTree::getPTHisto(){
for(int i=0;i<150;i++){
h.push_back(0);
}
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
float pt = itr->second->getLDPatternPT();
if(pt>149)
pt=149;
if(pt<0)
pt=0;
h[(int)pt]=h[(int)pt]+1;

if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
float pt = itr->second->getLDPatternPT();
if(pt>149)
pt=149;
if(pt<0)
pt=0;
h[(int)pt]=h[(int)pt]+1;
}
}
if(v_patterns.size()!=0){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
float pt = (*itr)->getLDPatternPT();
if(pt>149)
pt=149;
if(pt<0)
pt=0;
h[(int)pt]=h[(int)pt]+1;
}
}
return h;
}

int PatternTree::getFDPatternNumber(){
vector<GradedPattern*> res;
int num=0;
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
num += itr->second->getFDPatternNumber();
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
num += itr->second->getFDPatternNumber();
}
}
if(v_patterns.size()!=0){
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
num += (*itr)->getFDPatternNumber();
}
}
return num;
}

int PatternTree::getLDPatternNumber(){
return patterns.size();
if(patterns.size()!=0)
return patterns.size();
else
return v_patterns.size();
}

void PatternTree::computeAdaptativePatterns(short r){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
itr->second->computeAdaptativePattern(r);
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
itr->second->computeAdaptativePattern(r);
}
}
else{
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
(*itr)->computeAdaptativePattern(r);
}
}
}

void PatternTree::link(Detector& d, const vector< vector<int> >& sec, const vector<map<int, vector<int> > >& modules){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
itr->second->link(d,sec, modules);
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
itr->second->link(d,sec, modules);
}
}
else{
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
(*itr)->link(d,sec, modules);
}
}
}

#ifdef IPNL_USE_CUDA
void PatternTree::linkCuda(patternBank* p, deviceDetector* d, const vector< vector<int> >& sec, const vector<map<int, vector<int> > >& modules, vector<int> layers){
int counter=0;
unsigned int* cache = new unsigned int[PATTERN_LAYERS*PATTERN_SSTRIPS];
if(patterns.size()!=0){
cudaSetNbPatterns(p, patterns.size());
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
itr->second->linkCuda(p, d, counter, sec, modules, layers, cache);
counter++;
if(counter%10000==0){
cout<<counter*100/patterns.size()<<"%\r";
cout.flush();
}
}
}
else{
cudaSetNbPatterns(p, v_patterns.size());
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
(*itr)->linkCuda(p, d, counter, sec, modules, layers, cache);
counter++;
if(counter%10000==0){
cout<<counter*100/v_patterns.size()<<"%\r";
cout.flush();
}
}
}
delete[] cache;
}
#endif


void PatternTree::getActivePatterns(int active_threshold, vector<GradedPattern*>& active_patterns){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
GradedPattern* p = itr->second->getActivePattern(active_threshold);
if(p!=NULL)
active_patterns.push_back(p);
if(patterns.size()!=0){
for(map<string, PatternTrunk*>::iterator itr = patterns.begin(); itr != patterns.end(); ++itr){
GradedPattern* p = itr->second->getActivePattern(active_threshold);
if(p!=NULL)
active_patterns.push_back(p);
}
}
else{
for(vector<PatternTrunk*>::iterator itr = v_patterns.begin(); itr != v_patterns.end(); ++itr){
GradedPattern* p = (*itr)->getActivePattern(active_threshold);
if(p!=NULL)
active_patterns.push_back(p);
}
}
}

void PatternTree::addPatternsFromTree(PatternTree* p){
if(patterns.size()==0)
switchToMap();
vector<GradedPattern*> ld = p->getLDPatterns();
for(unsigned int i=0;i<ld.size();i++){
GradedPattern* patt = ld[i];
Expand All @@ -115,6 +240,8 @@ void PatternTree::addPatternsFromTree(PatternTree* p){


void PatternTree::addPatternForMerging(GradedPattern* ldp){
if(patterns.size()==0)
switchToMap();
string key = ldp->getKey();
map<string, PatternTrunk*>::iterator it = patterns.find(key);
if(it==patterns.end()){//not found
Expand All @@ -126,13 +253,15 @@ void PatternTree::addPatternForMerging(GradedPattern* ldp){
}
else{
(it->second)->updateDCBits(ldp);
for(int i=0;i<ldp->getGrade();i++){
(it->second)->addFDPattern(NULL, ldp->getAveragePt());
}
for(int i=0;i<ldp->getGrade();i++){
(it->second)->addFDPattern(NULL, ldp->getAveragePt());
}
}
}

bool PatternTree::checkPattern(Pattern* lp, Pattern* hp){
if(patterns.size()==0)
switchToMap();
if(lp==NULL || hp==NULL)
return false;
string key = lp->getKey();
Expand Down
12 changes: 8 additions & 4 deletions L1Trigger/TrackFindingAM/src/SectorTree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
SectorTree::SectorTree(){
srand ( time(NULL) );
superStripSize=-1;
mapNeedsUpdate=true;
}

SectorTree::~SectorTree(){
Expand All @@ -12,6 +13,11 @@ SectorTree::~SectorTree(){
}

Sector* SectorTree::getSector(vector<int> ladders, vector<int> modules){

// check that the multimap is populated
if(mapNeedsUpdate)
updateSectorMap();

pair<multimap<string,Sector*>::iterator,multimap<string,Sector*>::iterator> ret;
multimap<string,Sector*>::iterator first;

Expand Down Expand Up @@ -63,10 +69,7 @@ Sector* SectorTree::getSector(const Hit& h){
void SectorTree::addSector(Sector s){
Sector* ns = new Sector(s);
sector_list.push_back(ns);
vector<string> keys = ns->getKeys();
for(unsigned int i=0;i<keys.size();i++){
sectors.insert(pair<string, Sector*>(keys[i],ns));
}
mapNeedsUpdate = true;
}

void SectorTree::updateSectorMap(){
Expand All @@ -78,6 +81,7 @@ void SectorTree::updateSectorMap(){
sectors.insert(pair<string, Sector*>(keys[i],ns));
}
}
mapNeedsUpdate=false;
}

vector<Sector*> SectorTree::getAllSectors(){
Expand Down

0 comments on commit ed15367

Please sign in to comment.