예제 #1
0
파일: tracking.C 프로젝트: krafczyk/AMS
//#############################################################################
void TrTrackA::del_hit(TrHitA* phit) {
      for(int i=0;i<NHits();i++) {
            if (phit==&_Hit[i]) {
                 _Hit.erase(_Hit.begin()+i);
                 _PathIntExist = false;
                 break;
            }
      }
}
예제 #2
0
파일: tracking.C 프로젝트: krafczyk/AMS
//#############################################################################
TrHitA* TrTrackA::add_hit(TrRecHitR* phit) {
      int index = 0;
      for (int i=0; i<NHits(); i++) {
            if (phit->Hit[2]<_Hit[i].Coo[2]) index++;
            else break;
      }
      _Hit.insert(_Hit.begin()+index, TrHitA(phit));
      _PathIntExist = false;
      return &_Hit[index];
}
예제 #3
0
파일: tracking.C 프로젝트: krafczyk/AMS
//#############################################################################
TrHitA* TrTrackA::add_hit(double* coo, double* ecoo, double* bfield) {
      int index = 0;
      for (int i=0; i<NHits(); i++) {
            if (coo[2]<_Hit[i].Coo[2]) index++;
            else break;
      }
      _Hit.insert(_Hit.begin()+index, TrHitA(coo, ecoo, bfield));
      _PathIntExist = false;
      return &_Hit[index];
}
예제 #4
0
cl_ulong GridBuilder::run(HitCollection & hits, uint nThreads, const EventSupplement & eventSupplement, const LayerSupplement & layerSupplement, Grid & grid)
{

	//store buffers to input data
	cl_mem x = hits.transfer.buffer(GlobalX()); cl_mem y =  hits.transfer.buffer(GlobalY()); cl_mem z =  hits.transfer.buffer(GlobalZ());
	cl_mem layer= hits.transfer.buffer(DetectorLayer()); cl_mem detId = hits.transfer.buffer(DetectorId()); cl_mem hitId = hits.transfer.buffer(HitId()); cl_mem evtId = hits.transfer.buffer(EventNumber());

	cl_event evt;

	local_param localMem(sizeof(cl_uint), (grid.config.nSectorsZ+1)*(grid.config.nSectorsPhi+1));

	if(localMem < ctx.getLocalMemSize()){
		LOG << "Grid count kernel with local memory" << std::endl;
		evt = gridCount.run(
				//configuration
				eventSupplement.transfer.buffer(Offset()), layerSupplement.transfer.buffer(NHits()), layerSupplement.transfer.buffer(Offset()), layerSupplement.nLayers,
				//grid data
				grid.transfer.buffer(Boundary()),
				//grid configuration
				grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ,
				grid.config.MIN_PHI, grid.config.sectorSizePhi(),grid.config.nSectorsPhi,
				// hit input
				x, y, z,
				//local memory
				localMem,
				//work item config
				range(nThreads,layerSupplement.nLayers, eventSupplement.nEvents),
				range(nThreads,1, 1));
	} else {
		LOG << "Grid count kernel WITHOUT local memory" << std::endl;
		evt = gridNoLocalCount.run(
				//configuration
				eventSupplement.transfer.buffer(Offset()), layerSupplement.transfer.buffer(NHits()), layerSupplement.transfer.buffer(Offset()), layerSupplement.nLayers,
				//grid data
				grid.transfer.buffer(Boundary()),
				//grid configuration
				grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ,
				grid.config.MIN_PHI, grid.config.sectorSizePhi(),grid.config.nSectorsPhi,
				// hit input
				x, y, z,
				//work item config
				range(nThreads,layerSupplement.nLayers, eventSupplement.nEvents),
				range(nThreads,1, 1));
	}
	GridBuilder::events.push_back(evt);

	ctx.finish_default_queue();

	//run prefix sum on grid boundaries
	LOG << "Grid prefix kernel" << std::endl;
	PrefixSum prefixSum(ctx);

	evt = prefixSum.run(grid.transfer.buffer(Boundary()), grid.size(),  nThreads, GridBuilder::events);
	GridBuilder::events.push_back(evt);

	ctx.finish_default_queue();

	//download updated grid
	grid.transfer.fromDevice(ctx,grid, &GridBuilder::events);
	if(PROLIX){
		printGrid(grid);
	}

	//allocate new buffers for ouput
	hits.transfer.initBuffers(ctx, hits);

	ctx.finish_default_queue();

	if(localMem*2 < ctx.getLocalMemSize()){
		LOG << "Grid store kernel with local memory" << std::endl;
		evt = gridStore.run(
				//configuration
				eventSupplement.transfer.buffer(Offset()), layerSupplement.transfer.buffer(NHits()), layerSupplement.transfer.buffer(Offset()), grid.config.nLayers,
				//grid data
				grid.transfer.buffer(Boundary()),
				//grid configuration
				grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ,
				grid.config.MIN_PHI, grid.config.sectorSizePhi(),grid.config.nSectorsPhi,
				// hit input
				x,y,z,
				layer,detId, hitId, evtId,
				// hit output
				hits.transfer.buffer(GlobalX()), hits.transfer.buffer(GlobalY()), hits.transfer.buffer(GlobalZ()),
				hits.transfer.buffer(DetectorLayer()), hits.transfer.buffer(DetectorId()), hits.transfer.buffer(HitId()), hits.transfer.buffer(EventNumber()),
				//local params
				localMem, localMem,
				//work item config
				range(nThreads,layerSupplement.nLayers, eventSupplement.nEvents),
				range(nThreads,1, 1));
	} else if(localMem < ctx.getLocalMemSize()){
		LOG << "Grid store kernel with only local WRITTEN memory" << std::endl;
		evt = gridWrittenLocalStore.run(
				//configuration
				eventSupplement.transfer.buffer(Offset()), layerSupplement.transfer.buffer(NHits()), layerSupplement.transfer.buffer(Offset()), grid.config.nLayers,
				//grid data
				grid.transfer.buffer(Boundary()),
				//grid configuration
				grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ,
				grid.config.MIN_PHI, grid.config.sectorSizePhi(),grid.config.nSectorsPhi,
				// hit input
				x,y,z,
				layer,detId, hitId, evtId,
				// hit output
				hits.transfer.buffer(GlobalX()), hits.transfer.buffer(GlobalY()), hits.transfer.buffer(GlobalZ()),
				hits.transfer.buffer(DetectorLayer()), hits.transfer.buffer(DetectorId()), hits.transfer.buffer(HitId()), hits.transfer.buffer(EventNumber()),
				//local params
				localMem,
				//work item config
				range(nThreads,layerSupplement.nLayers, eventSupplement.nEvents),
				range(nThreads,1, 1));
	} else {
		LOG << "Grid store kernel WITHOUT local memory" << std::endl;

		LOG << "\tInitializing written buffer...";
		clever::vector<uint, 1> m_written(0, grid.size(), ctx);
		LOG << "done[" << m_written.get_count()  << "]" << std::endl;

		evt = gridNoLocalStore.run(
				//configuration
				eventSupplement.transfer.buffer(Offset()), layerSupplement.transfer.buffer(NHits()), layerSupplement.transfer.buffer(Offset()), grid.config.nLayers,
				//grid data
				grid.transfer.buffer(Boundary()),
				//grid configuration
				grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ,
				grid.config.MIN_PHI, grid.config.sectorSizePhi(),grid.config.nSectorsPhi,
				// hit input
				x,y,z,
				layer,detId, hitId, evtId,
				// hit output
				hits.transfer.buffer(GlobalX()), hits.transfer.buffer(GlobalY()), hits.transfer.buffer(GlobalZ()),
				hits.transfer.buffer(DetectorLayer()), hits.transfer.buffer(DetectorId()), hits.transfer.buffer(HitId()), hits.transfer.buffer(EventNumber()),
				//global written
				m_written.get_mem(),
				//work item config
				range(nThreads,layerSupplement.nLayers, eventSupplement.nEvents),
				range(nThreads,1, 1));
	}

	GridBuilder::events.push_back(evt);

	ctx.finish_default_queue();

	//download updated hit data and grid
	//grid.transfer.fromDevice(ctx,grid, &events);
	//printGrid(grid);
	hits.transfer.fromDevice(ctx,hits, &GridBuilder::events);
	if(PROLIX)
		verifyGrid(hits, grid);

	//delete old buffers
	ctx.release_buffer(x); ctx.release_buffer(y); ctx.release_buffer(z);
	ctx.release_buffer(layer); ctx.release_buffer(detId); ctx.release_buffer(hitId); ctx.release_buffer(evtId);

	return 0;
}
예제 #5
0
파일: tracking.C 프로젝트: krafczyk/AMS
//#############################################################################
double* TrTrackA::PredictionStraightLine(TrHitA* phit){
      for(int i=0;i<NHits();i++) {
            if (phit==&_Hit[i]) return PredictionStraightLine(i);
      }
      return NULL;
}
예제 #6
0
파일: tracking.C 프로젝트: krafczyk/AMS
//#############################################################################
void TrTrackA::del_hit(int index) {
      if (index>=0 && index<NHits()) {
            _Hit.erase(_Hit.begin()+index);
            _PathIntExist = false;
      }
}