diff etc/tune.c @ 2:86e0b50a9b58 libtommath-orig ltm-0.30-orig

ltm 0.30 orig import
author Matt Johnston <matt@ucc.asn.au>
date Mon, 31 May 2004 18:25:22 +0000
parents
children d29b64170cf0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/tune.c	Mon May 31 18:25:22 2004 +0000
@@ -0,0 +1,176 @@
+/* Tune the Karatsuba parameters
+ *
+ * Tom St Denis, [email protected]
+ */
+#include <tommath.h>
+#include <time.h>
+
+/* how many times todo each size mult.  Depends on your computer.  For slow computers
+ * this can be low like 5 or 10.  For fast [re: Athlon] should be 25 - 50 or so 
+ */
+#define TIMES 50
+
+
+#ifndef X86_TIMER
+
+/* generic ISO C timer */
+ulong64 __T;
+void t_start(void) { __T = clock(); }
+ulong64 t_read(void) { return clock() - __T; }
+
+#else
+extern void t_start(void);
+extern ulong64 t_read(void);
+#endif
+
+ulong64
+time_mult (int max)
+{
+  int     x, y;
+  mp_int  a, b, c;
+
+  mp_init (&a);
+  mp_init (&b);
+  mp_init (&c);
+
+  t_start();
+  for (x = 32; x <= max; x += 4) {
+    mp_rand (&a, x);
+    mp_rand (&b, x);
+    for (y = 0; y < TIMES; y++) {
+      mp_mul (&a, &b, &c);
+    }
+  }
+  mp_clear (&a);
+  mp_clear (&b);
+  mp_clear (&c);
+  return t_read();
+}
+
+ulong64
+time_sqr (int max)
+{
+  int     x, y;
+  mp_int  a, b;
+
+  mp_init (&a);
+  mp_init (&b);
+
+  t_start();
+  for (x = 32; x <= max; x += 4) {
+    mp_rand (&a, x);
+    for (y = 0; y < TIMES; y++) {
+      mp_sqr (&a, &b);
+    }
+  }
+  mp_clear (&a);
+  mp_clear (&b);
+  return t_read();
+}
+
+int
+main (void)
+{
+  int     best_kmult, best_tmult, best_ksquare, best_tsquare, counter;
+  ulong64 best, ti;
+  FILE   *log;
+
+  best_kmult = best_ksquare = best_tmult = best_tsquare = 0;
+  /* tune multiplication first */
+  
+  /* effectively turn TOOM off */
+  TOOM_SQR_CUTOFF = TOOM_MUL_CUTOFF = 100000;
+    
+  log = fopen ("mult.log", "w");
+  best = -1;
+  counter = 16;
+  for (KARATSUBA_MUL_CUTOFF = 8; KARATSUBA_MUL_CUTOFF <= 200; KARATSUBA_MUL_CUTOFF++) {
+    ti = time_mult (300);
+    printf ("%4d : %9llu            \r", KARATSUBA_MUL_CUTOFF, ti);
+    fprintf (log, "%d, %llu\n", KARATSUBA_MUL_CUTOFF, ti);
+    fflush (stdout);
+    if (ti < best) {
+      printf ("New best: %llu, %d         \r", ti, KARATSUBA_MUL_CUTOFF);
+      best = ti;
+      best_kmult = KARATSUBA_MUL_CUTOFF;
+      counter = 16;
+    } else if (--counter == 0) {
+       printf("No better found in 16 trials.\n");
+       break;
+    }
+  }
+  fclose (log);
+  printf("Karatsuba Multiplier Cutoff (KARATSUBA_MUL_CUTOFF) == %d\n", best_kmult);
+  
+  /* tune squaring */
+  log = fopen ("sqr.log", "w");
+  best = -1;
+  counter = 16;
+  for (KARATSUBA_SQR_CUTOFF = 8; KARATSUBA_SQR_CUTOFF <= 200; KARATSUBA_SQR_CUTOFF++) {
+    ti = time_sqr (300);
+    printf ("%4d : %9llu             \r", KARATSUBA_SQR_CUTOFF, ti);
+    fprintf (log, "%d, %llu\n", KARATSUBA_SQR_CUTOFF, ti);
+    fflush (stdout);
+    if (ti < best) {
+      printf ("New best: %llu, %d         \r", ti, KARATSUBA_SQR_CUTOFF);
+      best = ti;
+      best_ksquare = KARATSUBA_SQR_CUTOFF;
+      counter = 16;
+    } else if (--counter == 0) {
+       printf("No better found in 16 trials.\n");
+       break;
+    }
+  }
+  fclose (log);
+  printf("Karatsuba Squaring Cutoff (KARATSUBA_SQR_CUTOFF) == %d\n", best_ksquare);
+  
+  KARATSUBA_MUL_CUTOFF = best_kmult;
+  KARATSUBA_SQR_CUTOFF = best_ksquare;
+    
+  /* tune TOOM mult */
+  counter = 16;
+  log = fopen ("tmult.log", "w");
+  best = -1;
+  for (TOOM_MUL_CUTOFF = best_kmult*5; TOOM_MUL_CUTOFF <= 800; TOOM_MUL_CUTOFF++) {
+    ti = time_mult (1200);
+    printf ("%4d : %9llu          \r", TOOM_MUL_CUTOFF, ti);
+    fprintf (log, "%d, %llu\n", TOOM_MUL_CUTOFF, ti);
+    fflush (stdout);
+    if (ti < best) {
+      printf ("New best: %llu, %d         \r", ti, TOOM_MUL_CUTOFF);
+      best = ti;
+      best_tmult = TOOM_MUL_CUTOFF;
+      counter = 16;
+    } else if (--counter == 0) {
+       printf("No better found in 16 trials.\n");
+       break;
+    }
+  }
+  fclose (log);   
+  printf("Toom-Cook Multiplier Cutoff (TOOM_MUL_CUTOFF) == %d\n", best_tmult);
+  
+  /* tune TOOM sqr */
+  log = fopen ("tsqr.log", "w");
+  best = -1;
+  counter = 16;
+  for (TOOM_SQR_CUTOFF = best_ksquare*3; TOOM_SQR_CUTOFF <= 800; TOOM_SQR_CUTOFF++) {
+    ti = time_sqr (1200);
+    printf ("%4d : %9llu           \r", TOOM_SQR_CUTOFF, ti);
+    fprintf (log, "%d, %llu\n", TOOM_SQR_CUTOFF, ti);
+    fflush (stdout);
+    if (ti < best) {
+      printf ("New best: %llu, %d         \r", ti, TOOM_SQR_CUTOFF);
+      best = ti;
+      best_tsquare = TOOM_SQR_CUTOFF;
+      counter = 16;
+    } else if (--counter == 0) {
+       printf("No better found in 16 trials.\n");
+       break;
+    }
+  }
+  fclose (log);   
+  printf("Toom-Cook Squaring Cutoff (TOOM_SQR_CUTOFF) == %d\n", best_tsquare);
+
+
+  return 0;
+}