public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Benchtests: Improve bench-memcpy-random
@ 2021-10-18 15:19 Wilco Dijkstra
  2021-10-29  3:27 ` Siddhesh Poyarekar
  0 siblings, 1 reply; 2+ messages in thread
From: Wilco Dijkstra @ 2021-10-18 15:19 UTC (permalink / raw)
  To: 'GNU C Library'

Improve the random memcpy benchmark. Double the number of tests and increase
the size of the memory region to test between 32KB and 1024KB. This improves
accuracy on modern cores. Clean up formatting of the frequency array.

OK for commit?

---

diff --git a/benchtests/bench-memcpy-random.c b/benchtests/bench-memcpy-random.c
index c490b73ed07bfb8287ab7a41ac2cfb7c43d1d545..b2edd8b7e3d5503953f22365ba2a6fd0eace6fbc 100644
--- a/benchtests/bench-memcpy-random.c
+++ b/benchtests/bench-memcpy-random.c
@@ -16,15 +16,17 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define MIN_PAGE_SIZE (512*1024+getpagesize())
+#define MIN_SIZE 32768
+#define MAX_SIZE (1024*1024)
+#define NUM_TESTS 16384
+
+#define MIN_PAGE_SIZE (MAX_SIZE + getpagesize())
 #define TEST_MAIN
 #define TEST_NAME "memcpy"
 #include "bench-string.h"
 #include <assert.h>
 #include "json-lib.h"
 
-#define MAX_COPIES 8192
-
 IMPL (memcpy, 1)
 
 typedef struct { uint16_t size; uint16_t freq; } freq_data_t;
@@ -37,36 +39,36 @@ static uint8_t size_arr[SIZE_NUM];
 /* Frequency data for memcpy of less than 4096 bytes based on SPEC2017.  */
 static freq_data_t size_freq[] =
 {
-{ 32, 22320}, { 16, 9554}, {  8, 8915}, {152, 5327}, {  4, 2159}, {292, 2035},
-{ 12, 1608}, { 24, 1343}, {1152, 895}, {144, 813}, {884, 733}, {284, 721},
+{32,22320}, { 16,9554}, {  8,8915}, {152,5327}, {  4,2159}, {292,2035},
+{ 12,1608}, { 24,1343}, {1152,895}, {144, 813}, {884, 733}, {284, 721},
 {120, 661}, {  2, 649}, {882, 550}, {  5, 475}, {  7, 461}, {108, 460},
-{ 10, 361}, {  9, 361}, {  6, 334}, {  3, 326}, {464, 308}, {2048, 303},
+{ 10, 361}, {  9, 361}, {  6, 334}, {  3, 326}, {464, 308}, {2048,303},
 {  1, 298}, { 64, 250}, { 11, 197}, {296, 194}, { 68, 187}, { 15, 185},
-{192, 184}, {1764, 183}, { 13, 173}, {560, 126}, {160, 115}, {288,  96},
-{104,  96}, {1144,  83}, { 18,  80}, { 23,  78}, { 40,  77}, { 19,  68},
-{ 48,  63}, { 17,  57}, { 72,  54}, {1280,  51}, { 20,  49}, { 28,  47},
+{192, 184}, {1764,183}, { 13, 173}, {560, 126}, {160, 115}, {288,  96},
+{104,  96}, {1144, 83}, { 18,  80}, { 23,  78}, { 40,  77}, { 19,  68},
+{ 48,  63}, { 17,  57}, { 72,  54}, {1280, 51}, { 20,  49}, { 28,  47},
 { 22,  46}, {640,  45}, { 25,  41}, { 14,  40}, { 56,  37}, { 27,  35},
-{ 35,  33}, {384,  33}, { 29,  32}, { 80,  30}, {4095,  22}, {232,  22},
+{ 35,  33}, {384,  33}, { 29,  32}, { 80,  30}, {4095, 22}, {232,  22},
 { 36,  19}, {184,  17}, { 21,  17}, {256,  16}, { 44,  15}, { 26,  15},
-{ 31,  14}, { 88,  14}, {176,  13}, { 33,  12}, {1024,  12}, {208,  11},
+{ 31,  14}, { 88,  14}, {176,  13}, { 33,  12}, {1024, 12}, {208,  11},
 { 62,  11}, {128,  10}, {704,  10}, {324,  10}, { 96,  10}, { 60,   9},
-{136,   9}, {124,   9}, { 34,   8}, { 30,   8}, {480,   8}, {1344,   8},
+{136,   9}, {124,   9}, { 34,   8}, { 30,   8}, {480,   8}, {1344,  8},
 {273,   7}, {520,   7}, {112,   6}, { 52,   6}, {344,   6}, {336,   6},
 {504,   5}, {168,   5}, {424,   5}, {  0,   4}, { 76,   3}, {200,   3},
 {512,   3}, {312,   3}, {240,   3}, {960,   3}, {264,   2}, {672,   2},
 { 38,   2}, {328,   2}, { 84,   2}, { 39,   2}, {216,   2}, { 42,   2},
-{ 37,   2}, {1608,   2}, { 70,   2}, { 46,   2}, {536,   2}, {280,   1},
-{248,   1}, { 47,   1}, {1088,   1}, {1288,   1}, {224,   1}, { 41,   1},
+{ 37,   2}, {1608,  2}, { 70,   2}, { 46,   2}, {536,   2}, {280,   1},
+{248,   1}, { 47,   1}, {1088,  1}, {1288,  1}, {224,   1}, { 41,   1},
 { 50,   1}, { 49,   1}, {808,   1}, {360,   1}, {440,   1}, { 43,   1},
 { 45,   1}, { 78,   1}, {968,   1}, {392,   1}, { 54,   1}, { 53,   1},
 { 59,   1}, {376,   1}, {664,   1}, { 58,   1}, {272,   1}, { 66,   1},
-{2688,   1}, {472,   1}, {568,   1}, {720,   1}, { 51,   1}, { 63,   1},
+{2688,  1}, {472,   1}, {568,   1}, {720,   1}, { 51,   1}, { 63,   1},
 { 86,   1}, {496,   1}, {776,   1}, { 57,   1}, {680,   1}, {792,   1},
 {122,   1}, {760,   1}, {824,   1}, {552,   1}, { 67,   1}, {456,   1},
 {984,   1}, { 74,   1}, {408,   1}, { 75,   1}, { 92,   1}, {576,   1},
 {116,   1}, { 65,   1}, {117,   1}, { 82,   1}, {352,   1}, { 55,   1},
 {100,   1}, { 90,   1}, {696,   1}, {111,   1}, {880,   1}, { 79,   1},
-{488,   1}, { 61,   1}, {114,   1}, { 94,   1}, {1032,   1}, { 98,   1},
+{488,   1}, { 61,   1}, {114,   1}, { 94,   1}, {1032,  1}, { 98,   1},
 { 87,   1}, {584,   1}, { 85,   1}, {648,   1}, {0, 0}
 };
 
@@ -94,7 +96,7 @@ typedef struct
   uint64_t len : 16;
 } copy_t;
 
-static copy_t copy[MAX_COPIES];
+static copy_t test_arr[NUM_TESTS];
 
 typedef char *(*proto_t) (char *, const char *, size_t);
 
@@ -150,13 +152,13 @@ do_test (json_ctx_t *json_ctx, size_t max_size)
 
   /* Create a random set of copies with the given size and alignment
      distributions.  */
-  for (i = 0; i < MAX_COPIES; i++)
+  for (i = 0; i < NUM_TESTS; i++)
     {
-      copy[i].dst = (rand () & (max_size - 1));
-      copy[i].dst &= ~dst_align_arr[rand () & ALIGN_MASK];
-      copy[i].src = (rand () & (max_size - 1));
-      copy[i].src &= ~src_align_arr[rand () & ALIGN_MASK];
-      copy[i].len = size_arr[rand () & SIZE_MASK];
+      test_arr[i].dst = (rand () & (max_size - 1));
+      test_arr[i].dst &= ~dst_align_arr[rand () & ALIGN_MASK];
+      test_arr[i].src = (rand () & (max_size - 1));
+      test_arr[i].src &= ~src_align_arr[rand () & ALIGN_MASK];
+      test_arr[i].len = size_arr[rand () & SIZE_MASK];
     }
 
   json_element_object_begin (json_ctx);
@@ -164,7 +166,7 @@ do_test (json_ctx_t *json_ctx, size_t max_size)
   json_array_begin (json_ctx, "timings");
 
   FOR_EACH_IMPL (impl, 0)
-    do_one_test (json_ctx, impl, (char *) buf2, (char *) buf1, copy, i);
+    do_one_test (json_ctx, impl, (char *) buf2, (char *) buf1, test_arr, i);
 
   json_array_end (json_ctx);
   json_element_object_end (json_ctx);
@@ -193,8 +195,8 @@ test_main (void)
   json_array_end (&json_ctx);
 
   json_array_begin (&json_ctx, "results");
-  for (int i = 4; i <= 512; i = i * 2)
-    do_test (&json_ctx, i * 1024);
+  for (int i = MIN_SIZE; i <= MAX_SIZE; i = i * 2)
+    do_test (&json_ctx, i);
 
   json_array_end (&json_ctx);
   json_attr_object_end (&json_ctx);

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Benchtests: Improve bench-memcpy-random
  2021-10-18 15:19 [PATCH] Benchtests: Improve bench-memcpy-random Wilco Dijkstra
@ 2021-10-29  3:27 ` Siddhesh Poyarekar
  0 siblings, 0 replies; 2+ messages in thread
From: Siddhesh Poyarekar @ 2021-10-29  3:27 UTC (permalink / raw)
  To: Wilco Dijkstra, 'GNU C Library'

On 10/18/21 20:49, Wilco Dijkstra via Libc-alpha wrote:
> Improve the random memcpy benchmark. Double the number of tests and increase
> the size of the memory region to test between 32KB and 1024KB. This improves
> accuracy on modern cores. Clean up formatting of the frequency array.
> 
> OK for commit?

LGTM.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

> 
> ---
> 
> diff --git a/benchtests/bench-memcpy-random.c b/benchtests/bench-memcpy-random.c
> index c490b73ed07bfb8287ab7a41ac2cfb7c43d1d545..b2edd8b7e3d5503953f22365ba2a6fd0eace6fbc 100644
> --- a/benchtests/bench-memcpy-random.c
> +++ b/benchtests/bench-memcpy-random.c
> @@ -16,15 +16,17 @@
>      License along with the GNU C Library; if not, see
>      <https://www.gnu.org/licenses/>.  */
>   
> -#define MIN_PAGE_SIZE (512*1024+getpagesize())
> +#define MIN_SIZE 32768
> +#define MAX_SIZE (1024*1024)
> +#define NUM_TESTS 16384
> +
> +#define MIN_PAGE_SIZE (MAX_SIZE + getpagesize())
>   #define TEST_MAIN
>   #define TEST_NAME "memcpy"
>   #include "bench-string.h"
>   #include <assert.h>
>   #include "json-lib.h"
>   
> -#define MAX_COPIES 8192
> -

Renamed MAX_COPIES to NUM_TESTS macroized, loop range and bumped all of 
it up.  OK.

>   IMPL (memcpy, 1)
>   
>   typedef struct { uint16_t size; uint16_t freq; } freq_data_t;
> @@ -37,36 +39,36 @@ static uint8_t size_arr[SIZE_NUM];
>   /* Frequency data for memcpy of less than 4096 bytes based on SPEC2017.  */
>   static freq_data_t size_freq[] =
>   {
> -{ 32, 22320}, { 16, 9554}, {  8, 8915}, {152, 5327}, {  4, 2159}, {292, 2035},
> -{ 12, 1608}, { 24, 1343}, {1152, 895}, {144, 813}, {884, 733}, {284, 721},
> +{32,22320}, { 16,9554}, {  8,8915}, {152,5327}, {  4,2159}, {292,2035},
> +{ 12,1608}, { 24,1343}, {1152,895}, {144, 813}, {884, 733}, {284, 721},
>   {120, 661}, {  2, 649}, {882, 550}, {  5, 475}, {  7, 461}, {108, 460},
> -{ 10, 361}, {  9, 361}, {  6, 334}, {  3, 326}, {464, 308}, {2048, 303},
> +{ 10, 361}, {  9, 361}, {  6, 334}, {  3, 326}, {464, 308}, {2048,303},
>   {  1, 298}, { 64, 250}, { 11, 197}, {296, 194}, { 68, 187}, { 15, 185},
> -{192, 184}, {1764, 183}, { 13, 173}, {560, 126}, {160, 115}, {288,  96},
> -{104,  96}, {1144,  83}, { 18,  80}, { 23,  78}, { 40,  77}, { 19,  68},
> -{ 48,  63}, { 17,  57}, { 72,  54}, {1280,  51}, { 20,  49}, { 28,  47},
> +{192, 184}, {1764,183}, { 13, 173}, {560, 126}, {160, 115}, {288,  96},
> +{104,  96}, {1144, 83}, { 18,  80}, { 23,  78}, { 40,  77}, { 19,  68},
> +{ 48,  63}, { 17,  57}, { 72,  54}, {1280, 51}, { 20,  49}, { 28,  47},
>   { 22,  46}, {640,  45}, { 25,  41}, { 14,  40}, { 56,  37}, { 27,  35},
> -{ 35,  33}, {384,  33}, { 29,  32}, { 80,  30}, {4095,  22}, {232,  22},
> +{ 35,  33}, {384,  33}, { 29,  32}, { 80,  30}, {4095, 22}, {232,  22},
>   { 36,  19}, {184,  17}, { 21,  17}, {256,  16}, { 44,  15}, { 26,  15},
> -{ 31,  14}, { 88,  14}, {176,  13}, { 33,  12}, {1024,  12}, {208,  11},
> +{ 31,  14}, { 88,  14}, {176,  13}, { 33,  12}, {1024, 12}, {208,  11},
>   { 62,  11}, {128,  10}, {704,  10}, {324,  10}, { 96,  10}, { 60,   9},
> -{136,   9}, {124,   9}, { 34,   8}, { 30,   8}, {480,   8}, {1344,   8},
> +{136,   9}, {124,   9}, { 34,   8}, { 30,   8}, {480,   8}, {1344,  8},
>   {273,   7}, {520,   7}, {112,   6}, { 52,   6}, {344,   6}, {336,   6},
>   {504,   5}, {168,   5}, {424,   5}, {  0,   4}, { 76,   3}, {200,   3},
>   {512,   3}, {312,   3}, {240,   3}, {960,   3}, {264,   2}, {672,   2},
>   { 38,   2}, {328,   2}, { 84,   2}, { 39,   2}, {216,   2}, { 42,   2},
> -{ 37,   2}, {1608,   2}, { 70,   2}, { 46,   2}, {536,   2}, {280,   1},
> -{248,   1}, { 47,   1}, {1088,   1}, {1288,   1}, {224,   1}, { 41,   1},
> +{ 37,   2}, {1608,  2}, { 70,   2}, { 46,   2}, {536,   2}, {280,   1},
> +{248,   1}, { 47,   1}, {1088,  1}, {1288,  1}, {224,   1}, { 41,   1},
>   { 50,   1}, { 49,   1}, {808,   1}, {360,   1}, {440,   1}, { 43,   1},
>   { 45,   1}, { 78,   1}, {968,   1}, {392,   1}, { 54,   1}, { 53,   1},
>   { 59,   1}, {376,   1}, {664,   1}, { 58,   1}, {272,   1}, { 66,   1},
> -{2688,   1}, {472,   1}, {568,   1}, {720,   1}, { 51,   1}, { 63,   1},
> +{2688,  1}, {472,   1}, {568,   1}, {720,   1}, { 51,   1}, { 63,   1},
>   { 86,   1}, {496,   1}, {776,   1}, { 57,   1}, {680,   1}, {792,   1},
>   {122,   1}, {760,   1}, {824,   1}, {552,   1}, { 67,   1}, {456,   1},
>   {984,   1}, { 74,   1}, {408,   1}, { 75,   1}, { 92,   1}, {576,   1},
>   {116,   1}, { 65,   1}, {117,   1}, { 82,   1}, {352,   1}, { 55,   1},
>   {100,   1}, { 90,   1}, {696,   1}, {111,   1}, {880,   1}, { 79,   1},
> -{488,   1}, { 61,   1}, {114,   1}, { 94,   1}, {1032,   1}, { 98,   1},
> +{488,   1}, { 61,   1}, {114,   1}, { 94,   1}, {1032,  1}, { 98,   1},
>   { 87,   1}, {584,   1}, { 85,   1}, {648,   1}, {0, 0}
>   };

Updated frequency data.  OK.

>   
> @@ -94,7 +96,7 @@ typedef struct
>     uint64_t len : 16;
>   } copy_t;
>   
> -static copy_t copy[MAX_COPIES];
> +static copy_t test_arr[NUM_TESTS];
>   
>   typedef char *(*proto_t) (char *, const char *, size_t);
>   
> @@ -150,13 +152,13 @@ do_test (json_ctx_t *json_ctx, size_t max_size)
>   
>     /* Create a random set of copies with the given size and alignment
>        distributions.  */
> -  for (i = 0; i < MAX_COPIES; i++)
> +  for (i = 0; i < NUM_TESTS; i++)
>       {
> -      copy[i].dst = (rand () & (max_size - 1));
> -      copy[i].dst &= ~dst_align_arr[rand () & ALIGN_MASK];
> -      copy[i].src = (rand () & (max_size - 1));
> -      copy[i].src &= ~src_align_arr[rand () & ALIGN_MASK];
> -      copy[i].len = size_arr[rand () & SIZE_MASK];
> +      test_arr[i].dst = (rand () & (max_size - 1));
> +      test_arr[i].dst &= ~dst_align_arr[rand () & ALIGN_MASK];
> +      test_arr[i].src = (rand () & (max_size - 1));
> +      test_arr[i].src &= ~src_align_arr[rand () & ALIGN_MASK];
> +      test_arr[i].len = size_arr[rand () & SIZE_MASK];

Renamed array.  OK.

>       }
>   
>     json_element_object_begin (json_ctx);
> @@ -164,7 +166,7 @@ do_test (json_ctx_t *json_ctx, size_t max_size)
>     json_array_begin (json_ctx, "timings");
>   
>     FOR_EACH_IMPL (impl, 0)
> -    do_one_test (json_ctx, impl, (char *) buf2, (char *) buf1, copy, i);
> +    do_one_test (json_ctx, impl, (char *) buf2, (char *) buf1, test_arr, i);
>   
>     json_array_end (json_ctx);
>     json_element_object_end (json_ctx);
> @@ -193,8 +195,8 @@ test_main (void)
>     json_array_end (&json_ctx);
>   
>     json_array_begin (&json_ctx, "results");
> -  for (int i = 4; i <= 512; i = i * 2)
> -    do_test (&json_ctx, i * 1024);
> +  for (int i = MIN_SIZE; i <= MAX_SIZE; i = i * 2)
> +    do_test (&json_ctx, i);
>   
>     json_array_end (&json_ctx);
>     json_attr_object_end (&json_ctx);
> 

OK.

Thanks,
Siddhesh

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-10-29  3:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-18 15:19 [PATCH] Benchtests: Improve bench-memcpy-random Wilco Dijkstra
2021-10-29  3:27 ` Siddhesh Poyarekar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).