[v2,1/2] tests/qht-bench: Adjust testing rate by -1

Message ID 20200626200950.1015121-2-richard.henderson@linaro.org
State Superseded
Headers show
Series
  • tests/qht-bench: Adjust rate/threshold computation
Related show

Commit Message

Richard Henderson June 26, 2020, 8:09 p.m.
Since the seed must be non-zero, subtracting 1 means puts the
rate in 0..UINT64_MAX-1, which allows the 0 and UINT64_MAX
thresholds to corrspond to 0% (never) and 100% (always).

Suggested-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 tests/qht-bench.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

-- 
2.25.1

Comments

Philippe Mathieu-Daudé June 26, 2020, 8:39 p.m. | #1
On 6/26/20 10:09 PM, Richard Henderson wrote:
> Since the seed must be non-zero, subtracting 1 means puts the

> rate in 0..UINT64_MAX-1, which allows the 0 and UINT64_MAX

> thresholds to corrspond to 0% (never) and 100% (always).

> 

> Suggested-by: Emilio G. Cota <cota@braap.org>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  tests/qht-bench.c | 22 +++++++++++++++-------

>  1 file changed, 15 insertions(+), 7 deletions(-)

> 

> diff --git a/tests/qht-bench.c b/tests/qht-bench.c

> index eb88a90137..ad885d89d0 100644

> --- a/tests/qht-bench.c

> +++ b/tests/qht-bench.c

> @@ -25,7 +25,13 @@ struct thread_stats {

>  struct thread_info {

>      void (*func)(struct thread_info *);

>      struct thread_stats stats;

> -    uint64_t r;

> +    /*

> +     * Seed is in the range [1..UINT64_MAX], because the RNG requires

> +     * a non-zero seed.  To use, subtract 1 and compare against the

> +     * threshold with </>=.  This lets threshold = 0 never match (0% hit),

> +     * and threshold = UINT64_MAX always match (100% hit).

> +     */

> +    uint64_t seed;

>      bool write_op; /* writes alternate between insertions and removals */

>      bool resize_down;

>  } QEMU_ALIGNED(64); /* avoid false sharing among threads */

> @@ -131,8 +137,9 @@ static uint64_t xorshift64star(uint64_t x)

>  static void do_rz(struct thread_info *info)

>  {

>      struct thread_stats *stats = &info->stats;

> +    uint64_t r = info->seed - 1;

>  

> -    if (info->r < resize_threshold) {

> +    if (r < resize_threshold) {

>          size_t size = info->resize_down ? resize_min : resize_max;

>          bool resized;

>  

> @@ -151,13 +158,14 @@ static void do_rz(struct thread_info *info)

>  static void do_rw(struct thread_info *info)

>  {

>      struct thread_stats *stats = &info->stats;

> +    uint64_t r = info->seed - 1;

>      uint32_t hash;

>      long *p;

>  

> -    if (info->r >= update_threshold) {

> +    if (r >= update_threshold) {

>          bool read;

>  

> -        p = &keys[info->r & (lookup_range - 1)];

> +        p = &keys[r & (lookup_range - 1)];

>          hash = hfunc(*p);

>          read = qht_lookup(&ht, p, hash);

>          if (read) {

> @@ -166,7 +174,7 @@ static void do_rw(struct thread_info *info)

>              stats->not_rd++;

>          }

>      } else {

> -        p = &keys[info->r & (update_range - 1)];

> +        p = &keys[r & (update_range - 1)];

>          hash = hfunc(*p);

>          if (info->write_op) {

>              bool written = false;

> @@ -208,7 +216,7 @@ static void *thread_func(void *p)

>  

>      rcu_read_lock();

>      while (!atomic_read(&test_stop)) {

> -        info->r = xorshift64star(info->r);

> +        info->seed = xorshift64star(info->seed);

>          info->func(info);

>      }

>      rcu_read_unlock();

> @@ -221,7 +229,7 @@ static void *thread_func(void *p)

>  static void prepare_thread_info(struct thread_info *info, int i)

>  {

>      /* seed for the RNG; each thread should have a different one */

> -    info->r = (i + 1) ^ time(NULL);

> +    info->seed = (i + 1) ^ time(NULL);

>      /* the first update will be a write */

>      info->write_op = true;

>      /* the first resize will be down */

> 


Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

Patch

diff --git a/tests/qht-bench.c b/tests/qht-bench.c
index eb88a90137..ad885d89d0 100644
--- a/tests/qht-bench.c
+++ b/tests/qht-bench.c
@@ -25,7 +25,13 @@  struct thread_stats {
 struct thread_info {
     void (*func)(struct thread_info *);
     struct thread_stats stats;
-    uint64_t r;
+    /*
+     * Seed is in the range [1..UINT64_MAX], because the RNG requires
+     * a non-zero seed.  To use, subtract 1 and compare against the
+     * threshold with </>=.  This lets threshold = 0 never match (0% hit),
+     * and threshold = UINT64_MAX always match (100% hit).
+     */
+    uint64_t seed;
     bool write_op; /* writes alternate between insertions and removals */
     bool resize_down;
 } QEMU_ALIGNED(64); /* avoid false sharing among threads */
@@ -131,8 +137,9 @@  static uint64_t xorshift64star(uint64_t x)
 static void do_rz(struct thread_info *info)
 {
     struct thread_stats *stats = &info->stats;
+    uint64_t r = info->seed - 1;
 
-    if (info->r < resize_threshold) {
+    if (r < resize_threshold) {
         size_t size = info->resize_down ? resize_min : resize_max;
         bool resized;
 
@@ -151,13 +158,14 @@  static void do_rz(struct thread_info *info)
 static void do_rw(struct thread_info *info)
 {
     struct thread_stats *stats = &info->stats;
+    uint64_t r = info->seed - 1;
     uint32_t hash;
     long *p;
 
-    if (info->r >= update_threshold) {
+    if (r >= update_threshold) {
         bool read;
 
-        p = &keys[info->r & (lookup_range - 1)];
+        p = &keys[r & (lookup_range - 1)];
         hash = hfunc(*p);
         read = qht_lookup(&ht, p, hash);
         if (read) {
@@ -166,7 +174,7 @@  static void do_rw(struct thread_info *info)
             stats->not_rd++;
         }
     } else {
-        p = &keys[info->r & (update_range - 1)];
+        p = &keys[r & (update_range - 1)];
         hash = hfunc(*p);
         if (info->write_op) {
             bool written = false;
@@ -208,7 +216,7 @@  static void *thread_func(void *p)
 
     rcu_read_lock();
     while (!atomic_read(&test_stop)) {
-        info->r = xorshift64star(info->r);
+        info->seed = xorshift64star(info->seed);
         info->func(info);
     }
     rcu_read_unlock();
@@ -221,7 +229,7 @@  static void *thread_func(void *p)
 static void prepare_thread_info(struct thread_info *info, int i)
 {
     /* seed for the RNG; each thread should have a different one */
-    info->r = (i + 1) ^ time(NULL);
+    info->seed = (i + 1) ^ time(NULL);
     /* the first update will be a write */
     info->write_op = true;
     /* the first resize will be down */