patch for speed to measure the basic mpf functions

paul zimmermann Paul.Zimmermann at inria.fr
Thu Sep 1 14:47:12 UTC 2016


       Dear GMP developers,

below is a patch (against GMP 6.1.1) that allows to measure the basic mpf functions
using speed (with -s in bits):

$ ./speed -p1000000000 -c -s 113 mpf_add mpf_sub mpf_mul mpf_div mpf_sqrt
overhead 3.56 cycles, precision 1000000000 units of 1.25e-09 secs, CPU freq 800.13 MHz
              mpf_add       mpf_sub       mpf_mul       mpf_div      mpf_sqrt
113            #45.00         48.36         46.30        145.90        352.58

I contribute this patch to GMP, but most probably you can improve it.

Best regards,
Paul

--- common.c.orig	2016-09-01 15:48:21.378349300 +0200
+++ common.c	2016-09-01 16:34:24.035003662 +0200
@@ -1998,6 +1998,152 @@
 			    mpf_clear (f));
 }
 
+double
+speed_mpf_add (struct speed_params *s)
+{
+  mpf_t     w, x, y;
+  unsigned  i;
+  double    t;
+
+  mpf_init2 (w, s->size);
+  mpf_init2 (x, s->size);
+  mpf_init2 (y, s->size);
+
+  mpf_random2 (x, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_random2 (y, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_add (w, x, y);
+
+  speed_starttime ();
+  i = s->reps;
+  do
+    {
+      mpf_add (w, x, y);
+    }
+  while (--i != 0);
+  t = speed_endtime ();
+
+  mpf_clear (w);
+  mpf_clear (x);
+  mpf_clear (y);
+  return t;
+}
+
+double
+speed_mpf_sub (struct speed_params *s)
+{
+  mpf_t     w, x, y;
+  unsigned  i;
+  double    t;
+
+  mpf_init2 (w, s->size);
+  mpf_init2 (x, s->size);
+  mpf_init2 (y, s->size);
+
+  mpf_random2 (x, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_random2 (y, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_sub (w, x, y);
+
+  speed_starttime ();
+  i = s->reps;
+  do
+    {
+      mpf_sub (w, x, y);
+    }
+  while (--i != 0);
+  t = speed_endtime ();
+
+  mpf_clear (w);
+  mpf_clear (x);
+  mpf_clear (y);
+  return t;
+}
+
+double
+speed_mpf_mul (struct speed_params *s)
+{
+  mpf_t     w, x, y;
+  unsigned  i;
+  double    t;
+
+  mpf_init2 (w, s->size);
+  mpf_init2 (x, s->size);
+  mpf_init2 (y, s->size);
+
+  mpf_random2 (x, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_random2 (y, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_mul (w, x, y);
+
+  speed_starttime ();
+  i = s->reps;
+  do
+    {
+      mpf_mul (w, x, y);
+    }
+  while (--i != 0);
+  t = speed_endtime ();
+
+  mpf_clear (w);
+  mpf_clear (x);
+  mpf_clear (y);
+  return t;
+}
+
+double
+speed_mpf_div (struct speed_params *s)
+{
+  mpf_t     w, x, y;
+  unsigned  i;
+  double    t;
+
+  mpf_init2 (w, s->size);
+  mpf_init2 (x, s->size);
+  mpf_init2 (y, s->size);
+
+  mpf_random2 (x, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_random2 (y, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_div (w, x, y);
+
+  speed_starttime ();
+  i = s->reps;
+  do
+    {
+      mpf_div (w, x, y);
+    }
+  while (--i != 0);
+  t = speed_endtime ();
+
+  mpf_clear (w);
+  mpf_clear (x);
+  mpf_clear (y);
+  return t;
+}
+
+double
+speed_mpf_sqrt (struct speed_params *s)
+{
+  mpf_t     w, x;
+  unsigned  i;
+  double    t;
+
+  mpf_init2 (w, s->size);
+  mpf_init2 (x, s->size);
+
+  mpf_random2 (x, 1 + (s->size - 1) / GMP_NUMB_BITS, 0);
+  mpf_sqrt (w, x);
+
+  speed_starttime ();
+  i = s->reps;
+  do
+    {
+      mpf_sqrt (w, x);
+    }
+  while (--i != 0);
+  t = speed_endtime ();
+
+  mpf_clear (w);
+  mpf_clear (x);
+  return t;
+}
 
 /* Compare this to mpn_add_n to see how much overhead mpz_add adds.  Note
    that repeatedly calling mpz_add with the same data gives branch prediction
--- speed.c.orig	2016-09-01 15:48:04.174345004 +0200
+++ speed.c	2016-09-01 15:40:37.746232291 +0200
@@ -509,6 +509,11 @@
   { "mpz_init_clear",               speed_mpz_init_clear               },
   { "mpq_init_clear",               speed_mpq_init_clear               },
   { "mpf_init_clear",               speed_mpf_init_clear               },
+  { "mpf_add",                      speed_mpf_add                      },
+  { "mpf_sub",                      speed_mpf_sub                      },
+  { "mpf_mul",                      speed_mpf_mul                      },
+  { "mpf_div",                      speed_mpf_div                      },
+  { "mpf_sqrt",                     speed_mpf_sqrt                     },
   { "mpz_init_realloc_clear",       speed_mpz_init_realloc_clear       },
 
   { "umul_ppmm",         speed_umul_ppmm,     FLAG_R_OPTIONAL },
--- speed.h.orig	2016-09-01 15:48:10.370346551 +0200
+++ speed.h	2016-09-01 15:37:47.686188699 +0200
@@ -153,6 +153,11 @@
 double speed_binvert_limb_arith (struct speed_params *);
 
 double speed_mpf_init_clear (struct speed_params *);
+double speed_mpf_add (struct speed_params *);
+double speed_mpf_sub (struct speed_params *);
+double speed_mpf_mul (struct speed_params *);
+double speed_mpf_div (struct speed_params *);
+double speed_mpf_sqrt (struct speed_params *);
 
 double speed_mpn_add_n (struct speed_params *);
 double speed_mpn_add_1 (struct speed_params *);


More information about the gmp-devel mailing list