Opened 8 years ago
#783 new enhancement
Performance tuning for 1D calculations
Reported by: | pkienzle | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | sasmodels WishList |
Component: | sasmodels | Keywords: | |
Cc: | Work Package: | SasView Bug Fixing |
Description
Many of the 1D calculations involve nested integrals over a fixed set of theta and phi values, with trig functions to turn these values into something useful for the kernel.
For example, the cylinder kernel, 2 trig operations, a multiply and an add can be replaced by two table lookups by converting:
const double zm = M_PI_4; const double zb = M_PI_4; double total = 0.0; for (int i=0; i<76 ;i++) { const double alpha = Gauss76Z[i]*zm + zb; double sn, cn; // slots to hold sincos function output // alpha(theta,phi) the projection of the cylinder on the detector plane SINCOS(alpha, sn, cn); total += Gauss76Wt[i] * square(fq(q, sn, cn, radius, length)) * sn; } return total*zm;
into:
double total = 0.0; for (int i=0; i<76 ;i++) { total += Gauss76Wt_times_sin_alpha[i] * square(fq(q, sin_alpha[i], cos_alpha[i], radius, length)); } return total*M_PI_4;
To see if this might be worthwhile, I substituted Gauss76Z for the sin and Gauss76Wt for cos, and observed a 64% speedup. It had the wrong answer of course, but it does show that this approach could be worthwhile.
Note: See
TracTickets for help on using
tickets.