How can I optimize vector normalization in a Molecular Modeling program?

wetboy wetboy at shore.net
Mon Nov 8 16:15:34 EST 1999


In comp.lang.c willkn at montana.com wrote:
: 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

A few quick thoughts:

  1. Consider whether you really need double precision.  You
     might try two runs of your computation, one with double
     precision, the other with single precision, and compare
     the results.

  2. Square roots take a lot of time.  Can you work with
     the squared values, and avoid taking square roots?

  3. Consider the big picture:  Why are you doing this
     step?  Can you eliminate it, or integrate it better
     with what you're trying to do overall, so as to make
     the whole thing simpler and faster?

  4. If you're stuck with doing the square roots, you might
     surf the internet for faster algorithms.

-- Wetboy




More information about the Molmodel mailing list