How can I optimize vector normalization in a Molecular Modeling program?
Semler
semler at removethis.ioi.dk
Tue Nov 9 12:19:49 EST 1999
The MS Visual C++ version of sqrt is quite slow. Converting you routine to
assembly would speed this up.
Also all comments about using mult instead of divide is correct. fdiv takes
about 20 clocks to complete while
fmul takes 1 clock.
>Hi, I've been working on a molecular modeling program and have been
>trying to improve its performance recently. I did some profiling and
>found that the most time by far (41.4%) was spent in a function which
>normalizes a 3-dimensional vector (profiling statistics are given at
>the bottom).
>
>I am wondering if anyone has suggestions for optimizing that operation.
>Thanks,
>William Knight
>willkn at montana.com
>
>The definition of the function is given below:
>
>typedef double VTYPE;
>typedef VTYPE Vector[3];
>
>
>////////////////////////////////////////////////////////////////////////
>////////
>// MakeUnitVector
>//
>// Reduces a normal vector specified as a set of three coordinates,
>// to a unit normal vector of length one.
>//
>bool MakeUnitVector(Vector v)
> {
> VTYPE length;
>
> // Calculate the length of the vector
> length = (VTYPE)sqrt((v[0]*v[0]) + (v[1]*v[1]) + (v[2]*v[2]));
>
> // if length is zero, bail
> if(length == 0)
> return false;
>
> // Divide each element by the length to get a unit vector.
> v[0] /= length;
> v[1] /= length;
> v[2] /= length;
>
> return true;
> }// MakeUnitVector
>
>//***************** Profiling Details ************//
>
> Func Func+Child Hit
> Time % Time % Count Function
>---------------------------------------------------------
> 15493.876 41.4 15493.876 41.4 9971880 MakeUnitVector(double *
>const) (vector.obj)
> 5951.749 15.9 6789.747 18.1 627030
>CForceField::CalcVanderwaalsInteraction(void) (cforcefield.obj)
> 2185.047 5.8 18425.737 49.2 84010
>CForceField::CalcPotentialsAndForces(class CFFPairList *,class
>CEEPairList *,class CEOPairList *) (cforcefield.obj)
> 1976.562 5.3 13039.435 34.8 3752280
>CForceField::CalcEEInteraction(class CElectron *,class CElectron *)
>(cforcefield.obj)
> 1778.265 4.7 1778.265 4.7 4656515 VectorMagnitude(double *
>const) (vector.obj)
> 1668.910 4.5 1668.910 4.5 8884682 MultiplyVector(double *
>const,double) (vector.obj)
> 1270.428 3.4 1270.428 3.4 13438760 SubtractVector(double *
>const,double * const) (vector.obj)
> 1195.278 3.2 1195.278 3.2 21288242 AddVector(double *
>const,double * const) (vector.obj)
> 1145.663 3.1 1238.959 3.3 64 CStatus::Print(char *)
>(cstatus.obj)
>
>
>
>Sent via Deja.com http://www.deja.com/
>Before you buy.
More information about the Molmodel
mailing list