From 1080167638882569f0131c928c21173424bfbfab Mon Sep 17 00:00:00 2001 From: sgorbuno Date: Mon, 16 Jul 2012 00:27:33 +0000 Subject: [PATCH] - Speedup of cluster transformation in two times by the use of Vc library --- HLT/CMakelibAliHLTTPC.pkg | 4 +- .../transform/AliHLTTPCFastTransform.cxx | 1 + HLT/TPCLib/transform/AliHLTTPCFastTransform.h | 6 +- HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx | 160 +++++++++++------- HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h | 48 ++++-- 5 files changed, 135 insertions(+), 84 deletions(-) diff --git a/HLT/CMakelibAliHLTTPC.pkg b/HLT/CMakelibAliHLTTPC.pkg index 662b1f9e01c..d53fd4df8c7 100644 --- a/HLT/CMakelibAliHLTTPC.pkg +++ b/HLT/CMakelibAliHLTTPC.pkg @@ -139,7 +139,7 @@ set ( MODULE_DHDR ) set ( EINCLUDE HLT/TPCLib HLT/TPCLib/tracking HLT/TPCLib/comp HLT/TPCLib/tracking-ca HLT/TPCLib/merger-ca HLT/TPCLib/offline HLT/TPCLib/HWCFemulator HLT/TPCLib/transform HLT/BASE HLT/BASE/util HLT/RCU TPC RAW STEER/STEER STEER/ESD STEER/STEERBase) set ( ELIBS dl) -set ( ELIBS "HLTbase AliHLTRCU AliHLTUtil CDB ESD STEER STEERBase TPCrec TPCcalib TPCbase RAWDatarec RAWDatabase -lEG") +set ( ELIBS "Vc HLTbase AliHLTRCU AliHLTUtil CDB ESD STEER STEERBase TPCrec TPCcalib TPCbase RAWDatarec RAWDatabase -lEG") set ( ELIBSDIR "${ROOTLIBDIR}" ) @@ -168,6 +168,6 @@ set ( PACKCFLAGS ${HLTCLFAGS}) set ( PACKDCXXFLAGS ${HLTDCXXFLAGS}) set ( PACKSOFLAGS ${HLTSOFLAGS}) - +ALICE_UseVc() diff --git a/HLT/TPCLib/transform/AliHLTTPCFastTransform.cxx b/HLT/TPCLib/transform/AliHLTTPCFastTransform.cxx index 62d75a49e93..1fa67566ec3 100644 --- a/HLT/TPCLib/transform/AliHLTTPCFastTransform.cxx +++ b/HLT/TPCLib/transform/AliHLTTPCFastTransform.cxx @@ -184,6 +184,7 @@ Int_t AliHLTTPCFastTransform::InitRow( Int_t iSector, Int_t iRow ) fOrigTransform->Transform(xx,is,0,1); fRows[iSector][iRow]->fSpline[i].Fill(j,xx); } + fRows[iSector][iRow]->fSpline[i].Consolidate(); } return 0; } diff --git a/HLT/TPCLib/transform/AliHLTTPCFastTransform.h b/HLT/TPCLib/transform/AliHLTTPCFastTransform.h index 45d9a588f05..bd7f0d9787e 100644 --- a/HLT/TPCLib/transform/AliHLTTPCFastTransform.h +++ b/HLT/TPCLib/transform/AliHLTTPCFastTransform.h @@ -93,16 +93,14 @@ class AliHLTTPCFastTransform{ }; inline Int_t AliHLTTPCFastTransform::Transform( Int_t iSec, Int_t iRow, Float_t Pad, Float_t Time, Float_t XYZ[] ){ - if( !fOrigTransform || iSec<0 || iSec>=72 || iRow<0 || iRow>=100 ) return 1; - if( !fRows[iSec][iRow] && InitRow(iSec, iRow) ) return 1; + if( iSec<0 || iSec>=72 || iRow<0 || iRow>=100 || !fRows[iSec][iRow] ) return 1; Int_t iTime = ( Time>=fTimeBorder2 ) ?2 :( ( Time>fTimeBorder1 ) ?1 :0 ); fRows[iSec][iRow]->fSpline[iTime].GetValue(Pad, Time, XYZ); return 0; } inline Int_t AliHLTTPCFastTransform::Transform( Int_t iSec, Int_t iRow, Float_t Pad, Float_t Time, Double_t XYZ[] ){ - if( !fOrigTransform || iSec<0 || iSec>=72 || iRow<0 || iRow>=100 ) return 1; - if( !fRows[iSec][iRow] && InitRow(iSec, iRow) ) return 1; + if( iSec<0 || iSec>=72 || iRow<0 || iRow>=100 || !fRows[iSec][iRow] ) return 1; Int_t iTime = ( Time>=fTimeBorder2 ) ?2 :( ( Time>fTimeBorder1 ) ?1 :0 ); fRows[iSec][iRow]->fSpline[iTime].GetValue(Pad, Time, XYZ); return 0; diff --git a/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx b/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx index 6e8d6c338b8..b0f64e75457 100644 --- a/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx +++ b/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.cxx @@ -25,7 +25,8 @@ #include "AliTPCTransform.h" #include "AliTPCParam.h" #include "AliTPCcalibDB.h" - +#include "Vc/Vc" + #include #include @@ -33,8 +34,6 @@ using namespace std; - - void AliHLTTPCSpline2D3D::Init(Float_t minA,Float_t maxA, Int_t nBinsA, Float_t minB,Float_t maxB, Int_t nBinsB) { // @@ -43,8 +42,8 @@ void AliHLTTPCSpline2D3D::Init(Float_t minA,Float_t maxA, Int_t nBinsA, Float_ if( maxA<= minA ) maxA = minA+1; if( maxB<= minB ) maxB = minB+1; - if( nBinsA <3 ) nBinsA = 3; - if( nBinsB <3 ) nBinsB = 3; + if( nBinsA <4 ) nBinsA = 4; + if( nBinsB <4 ) nBinsB = 4; fNA = nBinsA; fNB = nBinsB; @@ -57,34 +56,66 @@ void AliHLTTPCSpline2D3D::Init(Float_t minA,Float_t maxA, Int_t nBinsA, Float_ fScaleA = 1./fStepA; fScaleB = 1./fStepB; - delete[] fX; - delete[] fY; - delete[] fZ; - fX = new Float_t [fN]; - fY = new Float_t [fN]; - fZ = new Float_t [fN]; - memset ( fX, 0, fN*sizeof(Float_t) ); - memset ( fY, 0, fN*sizeof(Float_t) ); - memset ( fZ, 0, fN*sizeof(Float_t) ); + delete[] fXYZ; + fXYZ = new Float_t [4*fN]; + memset ( fXYZ, 0, fN*4*sizeof(Float_t) ); } -void AliHLTTPCSpline2D3D::Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[]) ) + + +void AliHLTTPCSpline2D3D::Consolidate() { // - // Filling + // Consolidate the map // - - for( Int_t i=0; ifNA-4 ) iA = fNA-3; - else splineA3 = 1; - - Float_t lB = (B-fMinB)*fScaleB; - Int_t iB = ((int) lB)-1; - bool splineB3 = 0; - if( iB<0 ) iB=0; - else if( iB>fNB-4 ) iB = fNB-3; - else splineB3 = 1; - - Float_t da = lA-iA-1; - Float_t db = lB-iB-1; - - - Float_t v[3][4]; - Int_t ind = iA*fNB + iB; - for( Int_t i=0; i<3+splineA3; i++ ){ - if( splineB3 ){ - v[0][i] = GetSpline3(fX+ind,db); - v[1][i] = GetSpline3(fY+ind,db); - v[2][i] = GetSpline3(fZ+ind,db); - } else { - v[0][i] = GetSpline2(fX+ind,db); - v[1][i] = GetSpline2(fY+ind,db); - v[2][i] = GetSpline2(fZ+ind,db); + Float_t lA = (A-fMinA)*fScaleA-1.f; + Int_t iA = (int) lA; + if( lA<0 ) iA=0; + else if( iA>fNA-4 ) iA = fNA-4; + + Float_t lB = (B-fMinB)*fScaleB -1.f; + Int_t iB = (int) lB; + if( lB<0 ) iB=0; + else if( iB>fNB-4 ) iB = fNB-4; + + if( Vc::float_v::Size==4 ){ + Vc::float_v da = lA-iA; + Vc::float_v db = lB-iB; + Vc::float_v db2=db*db; + + Vc::float_v v[4]; + Int_t ind = iA*fNB + iB; + const Vc::float_v *m = reinterpret_cast< const Vc::float_v *>(fXYZ); + + for( Int_t i=0; i<4; i++ ){ + v[i] = GetSpline3Vc(m[ind+0],m[ind+1],m[ind+2],m[ind+3],db,db2); + ind+=fNB; } - ind+=fNB; - } - if( splineA3 ){ - XYZ[0] = GetSpline3(v[0],da); - XYZ[1] = GetSpline3(v[1],da); - XYZ[2] = GetSpline3(v[2],da); + Vc::float_v res=GetSpline3Vc(v[0],v[1],v[2],v[3],da,da*da); + XYZ[0] = res[0]; + XYZ[1] = res[1]; + XYZ[2] = res[2]; } else { - XYZ[0] = GetSpline2(v[0],da); - XYZ[1] = GetSpline2(v[1],da); - XYZ[2] = GetSpline2(v[2],da); + Float_t da = lA-iA; + Float_t db = lB-iB; + + Float_t vx[4]; + Float_t vy[4]; + Float_t vz[4]; + Int_t ind = iA*fNB + iB; + for( Int_t i=0; i<4; i++ ){ + int ind4 = ind*4; + vx[i] = GetSpline3(fXYZ[ind4+0],fXYZ[ind4+4],fXYZ[ind4 +8],fXYZ[ind4+12],db); + vy[i] = GetSpline3(fXYZ[ind4+1],fXYZ[ind4+5],fXYZ[ind4 +9],fXYZ[ind4+13],db); + vz[i] = GetSpline3(fXYZ[ind4+2],fXYZ[ind4+6],fXYZ[ind4+10],fXYZ[ind4+14],db); + ind+=fNB; + } + XYZ[0] = GetSpline3(vx,da); + XYZ[1] = GetSpline3(vy,da); + XYZ[2] = GetSpline3(vz,da); } } diff --git a/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h b/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h index d4508027589..414ad68a35b 100644 --- a/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h +++ b/HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h @@ -56,6 +56,9 @@ class AliHLTTPCSpline2D3D{ /** Get A,B by the point index */ void GetAB(Int_t ind, Float_t &A, Float_t &B) const ; + /** Consolidate the map*/ + void Consolidate(); + /** Get Interpolated value at A,B */ void GetValue(Float_t A, Float_t B, Float_t XYZ[]) const ; @@ -76,6 +79,7 @@ class AliHLTTPCSpline2D3D{ AliHLTTPCSpline2D3D& operator=(const AliHLTTPCSpline2D3D&); /** spline 3-st order, 4 points, da = a - point 1 */ + static Float_t GetSpline3(Float_t v0, Float_t v1, Float_t v2, Float_t v3, Float_t da); static Float_t GetSpline3(Float_t *v, Float_t da); /** spline 2-nd order, 3 points, da = a - point 1 */ @@ -90,34 +94,31 @@ class AliHLTTPCSpline2D3D{ Float_t fStepB; // step between points B axis Float_t fScaleA; // scale A axis Float_t fScaleB; // scale B axis - Float_t *fX; // array of points, X values - Float_t *fY; // array of points, Y values - Float_t *fZ; // array of points, Z values + Float_t *fXYZ; // array of points, {X,Y,Z,0} values }; inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D() -: fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0), fX(0), fY(0),fZ(0) + : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0) { } inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB) -: fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0), fX(0), fY(0),fZ(0) + : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0) { Init(minA, maxA, nBinsA, minB, maxB, nBinsB); } inline AliHLTTPCSpline2D3D::~AliHLTTPCSpline2D3D() { - delete[] fX; - delete[] fY; - delete[] fZ; + delete[] fXYZ; } inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t x, Float_t y, Float_t z) { - fX[ind] = x; - fY[ind] = y; - fZ[ind] = z; + Int_t ind4 = ind*4; + fXYZ[ind4] = x; + fXYZ[ind4+1] = y; + fXYZ[ind4+2] = z; } inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t XYZ[] ) @@ -130,6 +131,16 @@ inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Double_t XYZ[] ) Fill( ind, XYZ[0], XYZ[1], XYZ[2] ); } +inline void AliHLTTPCSpline2D3D::Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[]) ) +{ + for( Int_t i=0; i