changeset 4c0f7e5ae72a in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=4c0f7e5ae72a
description:
stats: when applying an operation to two vectors sum the components
first.
Previously writing X/Y in a formula would result in:
x[0]/y[0] + x[1]/y[1]
In reality you want:
(x[0] +x[1])/(y[0] + y[1])
diffstat:
src/base/statistics.hh | 24 +++++++++++++++++++++++-
1 files changed, 23 insertions(+), 1 deletions(-)
diffs (36 lines):
diff -r 9cad1c26c3b3 -r 4c0f7e5ae72a src/base/statistics.hh
--- a/src/base/statistics.hh Tue Jun 05 01:23:11 2012 -0400
+++ b/src/base/statistics.hh Tue Jun 05 01:23:11 2012 -0400
@@ -2289,9 +2289,31 @@
total() const
{
const VResult &vec = this->result();
+ const VResult &lvec = l->result();
+ const VResult &rvec = r->result();
Result total = 0.0;
- for (off_type i = 0; i < size(); i++)
+ Result lsum = 0.0;
+ Result rsum = 0.0;
+ Op op;
+
+ assert(lvec.size() > 0 && rvec.size() > 0);
+ assert(lvec.size() == rvec.size() ||
+ lvec.size() == 1 || rvec.size() == 1);
+
+ /** If vectors are the same divide their sums (x0+x1)/(y0+y1) */
+ if (lvec.size() == rvec.size() && lvec.size() > 1) {
+ for (off_type i = 0; i < size(); ++i) {
+ lsum += lvec[i];
+ rsum += rvec[i];
+ }
+ return op(lsum, rsum);
+ }
+
+ /** Otherwise divide each item by the divisor */
+ for (off_type i = 0; i < size(); ++i) {
total += vec[i];
+ }
+
return total;
}
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev