From 300d785201e33646eced205d35b1c6bbac4932cd Mon Sep 17 00:00:00 2001 From: Elmar Ritsch <Elmar.Ritsch@cern.ch> Date: Fri, 22 Apr 2016 14:52:01 +0200 Subject: [PATCH] Improve performance of heavily used BFieldCache::getB method by moving short->float type conversions out of tight for-loop. New BFieldCache::getB method is about 1.4 times faster. Bit-wise identical output is guaranteed (MagFieldServices-00-01-36) * Improve performance of heavily used BFieldCache::getB method by moving short->float type conversions out of tight for-loop. New BFieldCache::getB method is about 1.4 times faster. * Bit-wise identical output is guaranteed * Tagging as MagFieldServices-00-01-36 --- .../MagFieldServices/MagFieldServices/AtlasFieldSvc.h | 4 ++-- .../MagFieldServices/MagFieldServices/BFieldCache.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h index 34fe1162b061..e191ea7179b5 100644 --- a/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h +++ b/MagneticField/MagFieldServices/MagFieldServices/AtlasFieldSvc.h @@ -67,8 +67,8 @@ namespace MagField { /** get B field value at given position */ /** xyz[3] is in mm, bxyz[3] is in kT */ /** if deriv[9] is given, field derivatives are returned in kT/mm */ - virtual void getField(const double *xyz, double *bxyz, double *deriv = 0); - virtual void getFieldZR(const double *xyz, double *bxyz, double *deriv = 0); + virtual void getField(const double *xyz, double *bxyz, double *deriv = 0) override final; + virtual void getFieldZR(const double *xyz, double *bxyz, double *deriv = 0) override final; private: /* // Methods called to get field diff --git a/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h b/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h index 31d3d3418dce..f97aeaa6a6b0 100644 --- a/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h +++ b/MagneticField/MagFieldServices/MagFieldServices/BFieldCache.h @@ -43,7 +43,7 @@ private: double m_rmin, m_rmax; // bin range in r double m_phimin, m_phimax; // bin range in phi float m_invz, m_invr, m_invphi; // 1/(bin size) in z, r, phi - short m_field[3][8]; // (Bz,Br,Bphi) at 8 corners of the bin + float m_field[3][8]; // (Bz,Br,Bphi) at 8 corners of the bin float m_scale; // unit of m_field in kT }; @@ -67,7 +67,7 @@ BFieldCache::getB( const double *xyz, double r, double phi, double *B, double *d // interpolate field values in z, r, phi float Bzrphi[3]; for ( int i = 0; i < 3; i++ ) { // z, r, phi components - const short *field = m_field[i]; + const float *field = m_field[i]; Bzrphi[i] = m_scale*( gz*( gr*( gphi*field[0] + fphi*field[1] ) + fr*( gphi*field[2] + fphi*field[3] ) ) + fz*( gr*( gphi*field[4] + fphi*field[5] ) + @@ -95,7 +95,7 @@ BFieldCache::getB( const double *xyz, double r, double phi, double *B, double *d float sphi = m_scale*m_invphi; float dBdz[3], dBdr[3], dBdphi[3]; for ( int j = 0; j < 3; j++ ) { // Bz, Br, Bphi components - const short *field = m_field[j]; + const float *field = m_field[j]; dBdz[j] = sz*( gr*( gphi*(field[4]-field[0]) + fphi*(field[5]-field[1]) ) + fr*( gphi*(field[6]-field[2]) + fphi*(field[7]-field[3]) ) ); dBdr[j] = sr*( gz*( gphi*(field[2]-field[0]) + fphi*(field[3]-field[1]) ) + -- GitLab