RDMA update
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index b5ff0101b7b0feca625721bc10b351a48825a271..8be4be5761cbfda454da47f541965a67115c6b26 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -169,10 +169,10 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
        io_p = num2str(ts->io_bytes[ddir], 6, 1, i2p);
        bw_p = num2str(bw, 6, 1, i2p);
 
-       iops = (1000 * ts->total_io_u[ddir]) / runt;
+       iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt;
        iops_p = num2str(iops, 6, 1, 0);
 
-       log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6lumsec\n",
+       log_info("  %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n",
                                        ddir_str[ddir], io_p, bw_p, iops_p,
                                        ts->runtime[ddir]);
 
@@ -380,7 +380,7 @@ static void show_ddir_status_terse(struct thread_stat *ts,
        if (ts->runtime[ddir])
                bw = ts->io_bytes[ddir] / ts->runtime[ddir];
 
-       log_info(";%llu;%llu;%lu", ts->io_bytes[ddir] >> 10, bw,
+       log_info(";%llu;%llu;%llu", ts->io_bytes[ddir] >> 10, bw,
                                                        ts->runtime[ddir]);
 
        if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev))
@@ -474,21 +474,28 @@ static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr)
 
        dst->min_val = min(dst->min_val, src->min_val);
        dst->max_val = max(dst->max_val, src->max_val);
-       dst->samples += src->samples;
 
        /*
-        * Needs a new method for calculating stddev, we cannot just
-        * average them we do below for nr > 1
+        * Compute new mean and S after the merge
+        * <http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
+        *  #Parallel_algorithm>
         */
        if (nr == 1) {
                mean = src->mean;
                S = src->S;
        } else {
-               mean = ((src->mean * (double) (nr - 1))
-                               + dst->mean) / ((double) nr);
-               S = ((src->S * (double) (nr - 1)) + dst->S) / ((double) nr);
+               double delta = src->mean - dst->mean;
+
+               mean = ((src->mean * src->samples) +
+                       (dst->mean * dst->samples)) /
+                       (dst->samples + src->samples);
+
+               S =  src->S + dst->S + pow(delta, 2.0) *
+                       (dst->samples * src->samples) /
+                       (dst->samples + src->samples);
        }
 
+       dst->samples += src->samples;
        dst->mean = mean;
        dst->S = S;
 }
@@ -728,7 +735,7 @@ static inline void add_stat_sample(struct io_stat *is, unsigned long data)
 
 static void __add_log_sample(struct io_log *iolog, unsigned long val,
                             enum fio_ddir ddir, unsigned int bs,
-                            unsigned long time)
+                            unsigned long t)
 {
        const int nr_samples = iolog->nr_samples;
 
@@ -740,7 +747,7 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val,
        }
 
        iolog->log[nr_samples].val = val;
-       iolog->log[nr_samples].time = time;
+       iolog->log[nr_samples].time = t;
        iolog->log[nr_samples].ddir = ddir;
        iolog->log[nr_samples].bs = bs;
        iolog->nr_samples++;