projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Change network transmitted doubles to fio_fp64_t IEEE 754 type
[fio.git]
/
stat.c
diff --git
a/stat.c
b/stat.c
index 4bae5767c852cae4fb254a23f367c8a88463998e..7bcae310f8d41bb388abc1af6b773b6125ea0492 100644
(file)
--- a/
stat.c
+++ b/
stat.c
@@
-9,6
+9,7
@@
#include "fio.h"
#include "diskutil.h"
#include "fio.h"
#include "diskutil.h"
+#include "ieee754.h"
void update_rusage_stat(struct thread_data *td)
{
void update_rusage_stat(struct thread_data *td)
{
@@
-101,13
+102,13
@@
static unsigned int plat_idx_to_val(unsigned int idx)
static int double_cmp(const void *a, const void *b)
{
static int double_cmp(const void *a, const void *b)
{
- const
double fa = *(const double *)
a;
- const
double fb = *(const double *)
b;
+ const
fio_fp64_t fa = *(const fio_fp64_t *)
a;
+ const
fio_fp64_t fb = *(const fio_fp64_t *)
b;
int cmp = 0;
int cmp = 0;
- if (fa
> fb
)
+ if (fa
.u.f > fb.u.f
)
cmp = 1;
cmp = 1;
- else if (fa
< fb
)
+ else if (fa
.u.f < fb.u.f
)
cmp = -1;
return cmp;
cmp = -1;
return cmp;
@@
-116,38
+117,31
@@
static int double_cmp(const void *a, const void *b)
/*
* Find and display the p-th percentile of clat
*/
/*
* Find and display the p-th percentile of clat
*/
-static void show_clat_percentiles(unsigned int
*
io_u_plat, unsigned long nr,
-
double* user_
list)
+static void show_clat_percentiles(unsigned int
*
io_u_plat, unsigned long nr,
+
fio_fp64_t *p
list)
{
unsigned long sum = 0;
unsigned int len, i, j = 0;
{
unsigned long sum = 0;
unsigned int len, i, j = 0;
- const double *plist;
int is_last = 0;
int is_last = 0;
- static const double def_list[FIO_IO_U_LIST_MAX_LEN] = {
- 1.0, 5.0, 10.0, 20.0, 30.0,
- 40.0, 50.0, 60.0, 70.0, 80.0,
- 90.0, 95.0, 99.0, 99.5, 99.9};
- plist = user_list;
- if (!plist)
- plist = def_list;
-
- for (len = 0; len <FIO_IO_U_LIST_MAX_LEN && plist[len] != 0; len++)
- ;
+ len = 0;
+ while (len < FIO_IO_U_LIST_MAX_LEN && plist[len].u.f != 0.0)
+ len++;
/*
/*
- * Sort the user-specified list. Note that this does not work
- * for NaN values
+ * Sort the percentile list. Note that it may already be sorted if
+ * we are using the default values, but since it's a short list this
+ * isn't a worry. Also note that this does not work for NaN values.
*/
*/
- if (
user_list &&
len > 1)
- qsort((void*)
user_list, len, sizeof(user_
list[0]), double_cmp);
+ if (len > 1)
+ qsort((void*)
plist, len, sizeof(p
list[0]), double_cmp);
log_info(" clat percentiles (usec) :");
for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) {
sum += io_u_plat[i];
log_info(" clat percentiles (usec) :");
for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) {
sum += io_u_plat[i];
- while (sum >= (plist[j]
/ 10
0 * nr)) {
- assert(plist[j] <= 100.0);
+ while (sum >= (plist[j]
.u.f / 100.
0 * nr)) {
+ assert(plist[j]
.u.f
<= 100.0);
/* for formatting */
if (j != 0 && (j % 4) == 0)
/* for formatting */
if (j != 0 && (j % 4) == 0)
@@
-181,23
+175,23
@@
static int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max,
*max = is->max_val;
n = (double) is->samples;
*max = is->max_val;
n = (double) is->samples;
- *mean = is->mean;
+ *mean = is->mean
.u.f
;
if (n > 1.0)
if (n > 1.0)
- *dev = sqrt(is->S / (n - 1.0));
+ *dev = sqrt(is->S
.u.f
/ (n - 1.0));
else
*dev = 0;
return 1;
}
else
*dev = 0;
return 1;
}
-
static void show_group_stats(struct group_run_stats *rs, int id
)
+
void show_group_stats(struct group_run_stats *rs
)
{
char *p1, *p2, *p3, *p4;
const char *ddir_str[] = { " READ", " WRITE" };
int i;
{
char *p1, *p2, *p3, *p4;
const char *ddir_str[] = { " READ", " WRITE" };
int i;
- log_info("\nRun status group %d (all jobs):\n", id);
+ log_info("\nRun status group %d (all jobs):\n",
rs->group
id);
for (i = 0; i <= DDIR_WRITE; i++) {
const int i2p = is_power_of_2(rs->kb_base);
for (i = 0; i <= DDIR_WRITE; i++) {
const int i2p = is_power_of_2(rs->kb_base);
@@
-433,8
+427,7
@@
static void show_latencies(double *io_u_lat_u, double *io_u_lat_m)
log_info("\n");
}
log_info("\n");
}
-static void show_thread_status(struct thread_stat *ts,
- struct group_run_stats *rs)
+void show_thread_status(struct thread_stat *ts, struct group_run_stats *rs)
{
double usr_cpu, sys_cpu;
unsigned long runtime;
{
double usr_cpu, sys_cpu;
unsigned long runtime;
@@
-630,23
+623,23
@@
static void sum_stat(struct io_stat *dst, struct io_stat *src, int nr)
* #Parallel_algorithm>
*/
if (nr == 1) {
* #Parallel_algorithm>
*/
if (nr == 1) {
- mean = src->mean;
- S = src->S;
+ mean = src->mean
.u.f
;
+ S = src->S
.u.f
;
} else {
} else {
- double delta = src->mean
- dst->mean
;
+ double delta = src->mean
.u.f - dst->mean.u.f
;
- mean = ((src->mean * src->samples) +
- (dst->mean * dst->samples)) /
+ mean = ((src->mean
.u.f
* src->samples) +
+ (dst->mean
.u.f
* dst->samples)) /
(dst->samples + src->samples);
(dst->samples + src->samples);
- S = src->S
+ dst->S
+ pow(delta, 2.0) *
+ S = src->S
.u.f + dst->S.u.f
+ pow(delta, 2.0) *
(dst->samples * src->samples) /
(dst->samples + src->samples);
}
dst->samples += src->samples;
(dst->samples * src->samples) /
(dst->samples + src->samples);
}
dst->samples += src->samples;
- dst->mean = mean;
- dst->S = S;
+ dst->mean
.u.f
= mean;
+ dst->S
.u.f
= S;
}
void show_run_stats(void)
}
void show_run_stats(void)
@@
-716,9
+709,9
@@
void show_run_stats(void)
ts->clat_percentiles = td->o.clat_percentiles;
if (td->o.overwrite_plist)
ts->clat_percentiles = td->o.clat_percentiles;
if (td->o.overwrite_plist)
-
ts->percentile_list = td->o.percentile_list
;
+
memcpy(ts->percentile_list, td->o.percentile_list, sizeof(td->o.percentile_list))
;
else
else
-
ts->percentile_list = NULL
;
+
memcpy(ts->percentile_list, def_percentile_list, sizeof(def_percentile_list))
;
idx++;
ts->members++;
idx++;
ts->members++;
@@
-727,8
+720,13
@@
void show_run_stats(void)
/*
* These are per-group shared already
*/
/*
* These are per-group shared already
*/
- ts->name = td->o.name;
- ts->description = td->o.description;
+ strncpy(ts->name, td->o.name, FIO_JOBNAME_SIZE);
+ if (td->o.description)
+ strncpy(ts->description, td->o.description,
+ FIO_JOBNAME_SIZE);
+ else
+ memset(ts->description, 0, FIO_JOBNAME_SIZE);
+
ts->groupid = td->groupid;
/*
ts->groupid = td->groupid;
/*
@@
-750,10
+748,10
@@
void show_run_stats(void)
if (!td->error && td->o.continue_on_error &&
td->first_error) {
ts->error = td->first_error;
if (!td->error && td->o.continue_on_error &&
td->first_error) {
ts->error = td->first_error;
-
ts->verror = td->verror
;
+
strcpy(ts->verror, td->verror)
;
} else if (td->error) {
ts->error = td->error;
} else if (td->error) {
ts->error = td->error;
-
ts->verror = td->verror
;
+
strcpy(ts->verror, td->verror)
;
}
}
}
}
@@
-857,15
+855,24
@@
void show_run_stats(void)
ts = &threadstats[i];
rs = &runstats[ts->groupid];
ts = &threadstats[i];
rs = &runstats[ts->groupid];
- if (terse_output)
+ if (is_backend)
+ fio_server_send_ts(ts, rs);
+ else if (terse_output)
show_thread_status_terse(ts, rs);
else
show_thread_status(ts, rs);
}
if (!terse_output) {
show_thread_status_terse(ts, rs);
else
show_thread_status(ts, rs);
}
if (!terse_output) {
- for (i = 0; i < groupid + 1; i++)
- show_group_stats(&runstats[i], i);
+ for (i = 0; i < groupid + 1; i++) {
+ rs = &runstats[i];
+
+ rs->groupid = i;
+ if (is_backend)
+ fio_server_send_gs(rs);
+ else
+ show_group_stats(rs);
+ }
show_disk_util();
}
show_disk_util();
}
@@
-884,10
+891,10
@@
static inline void add_stat_sample(struct io_stat *is, unsigned long data)
if (data < is->min_val)
is->min_val = data;
if (data < is->min_val)
is->min_val = data;
- delta = val - is->mean;
+ delta = val - is->mean
.u.f
;
if (delta) {
if (delta) {
- is->mean += delta / (is->samples + 1.0);
- is->S
+= delta * (val - is->mean
);
+ is->mean
.u.f
+= delta / (is->samples + 1.0);
+ is->S
.u.f += delta * (val - is->mean.u.f
);
}
is->samples++;
}
is->samples++;