I'm trying to design (and hopefully implement later on) an evaluator system which would work either with polynomial based data or either with point based graph data ( list of [x,y] pairs from which interpolated values are calculated). So, for quick and dirty fade-in/out one can use simple polynomial data to quickly generate linear/exponential/... curves, while graph data points can be used for complex "animations". Evaluators are used by particle and audio system and based on profiling, they take a healthy chunk of the update time.
I already have a working point based evaluator:
- supports arbitrary number of points (data ptr + count)
- basic logic is that based on input relative x value, I have to find corresponding x-1 and x+1 pairs, and interpolate y between them
- float points are compressed into words to reduce data size and to speed up look-up
- constant / linear / step / bezier
What I don't like about it:
- data layout; even though data for multiple evaluators is packed together, it is still in two places (eval object + data*)
- the "find neighboring points" is currently a for loop, but as points can be unequally spread out, I don't have any other sane way to find them and since number of points is actually low (4-16) I didn't bother with anything but linear search
- logic & data layout; no sensible way to simd optimize this
Initially I had a static array of points but with a large number of evaluators the data grew fast. The data* + count solved that by a large factor. All in all, this is an ok-ish solution, I'm just wondering if there is a better way to handle it (for simd). Regarding the simd optimization, it seems that optimizing one evaluator is not really practical (or even "possible"). It seems more logical to try to run multiple evaluators at once, but to be honest I'm kinda stuck here...
The new polynomial part would be easy to add, the number of constants (degree) would be low, probably 4 or so, so a float vector would be enough to store data (c0 + c1*x + c2*xx + c3*xxx). The data would be used exclusively (its either polynomial or point list). So, the big question is how to combine/structure both parts of data and how to make the logic simd-able?