@@ -88,27 +88,36 @@ uint64_t global_rdtsc_overhead = (uint64_t)UINT64_MAX;
8888 fflush(NULL); \
8989 uint64_t cycles_start, cycles_final, cycles_diff; \
9090 uint64_t min_diff = (uint64_t)-1; \
91+ uint64_t min_sumclockdiff = (uint64_t)-1; \
9192 uint64_t sum_diff = 0; \
93+ uint64_t sumclockdiff = 0; \
9294 for (int i = 0; i < repeat; i++) { \
9395 pre; \
9496 __asm volatile("" ::: /* pretend to clobber */ "memory" ); \
97+ uint64_t bef = clock (); \
9598 RDTSC_START (cycles_start ); \
9699 if (test != expected ) { \
97100 printf ("not expected (%d , %d )" , (int )test , (int )expected ); \
98101 break ; \
99102 } \
100103 RDTSC_STOP (cycles_final ); \
104+ uint64_t aft = clock (); \
105+ sumclockdiff += (aft - bef ) ; \
106+ if (sumclockdiff < min_sumclockdiff ) \
107+ min_sumclockdiff = sumclockdiff ; \
101108 cycles_diff = (cycles_final - cycles_start - global_rdtsc_overhead ); \
102109 if (cycles_diff < min_diff ) \
103110 min_diff = cycles_diff ; \
104- sum_diff += cycles_diff ; \
111+ sum_diff += cycles_diff ; \
105112 } \
106113 uint64_t S = size ; \
107114 float cycle_per_op = (min_diff ) / (double )S ; \
108115 float avg_cycle_per_op = (sum_diff ) / ((double )S * repeat ); \
116+ float avg_gb_per_s = (CLOCKS_PER_SEC * (double )S * repeat ) / ((sumclockdiff ) * 1000.0 * 1000.0 * 1000.0 ); \
117+ float max_gb_per_s = (CLOCKS_PER_SEC * (double )S ) / ((min_sumclockdiff ) * 1000.0 * 1000.0 * 1000.0 ); \
109118 if (verbose ) printf (" %.3f %s per input byte (best) " , cycle_per_op , unitname ); \
110119 if (verbose ) printf (" %.3f %s per input byte (avg) " , avg_cycle_per_op , unitname ); \
111- if (!verbose ) printf (" %.3f " , cycle_per_op ); \
120+ if (!verbose ) printf (" %.3f %.3f %.3f %.3f " , cycle_per_op , avg_cycle_per_op - cycle_per_op , max_gb_per_s , avg_gb_per_s - max_gb_per_s ); \
112121 printf ("\n" ); \
113122 fflush (NULL ); \
114123 } while (0 )
0 commit comments