Commit 04ee1e75d7061b9a0c076b553c89be5b84d1f61e

Steffen Jaeckel 2019-10-28T15:07:58

improve demo/timing a bit * less verbose output on console * allow changing name for logs * pre-heat caches before starting the timing

diff --git a/demo/timing.c b/demo/timing.c
index fa5669c..8541250 100644
--- a/demo/timing.c
+++ b/demo/timing.c
@@ -20,6 +20,11 @@
 #define LTM_TIMING_RAND_SEED  23
 #endif
 
+#ifndef MP_VERSION
+#define MP_TIMING_VERSION
+#else
+#define MP_TIMING_VERSION "-" MP_VERSION
+#endif
 
 static void ndraw(const mp_int *a, const char *name)
 {
@@ -85,25 +90,28 @@ static uint64_t TIMFUNC(void)
 #endif
 }
 
+#define DO2(x) x; x
+#define DO4(x) DO2(x); DO2(x)
+#define DO8(x) DO4(x); DO4(x)
+
 #if 1
-#define DO(x) x; x;
+#define DO(x) DO2(x)
 #else
-#define DO2(x) x; x;
-#define DO4(x) DO2(x); DO2(x);
-#define DO8(x) DO4(x); DO4(x);
-#define DO(x)  DO8(x); DO8(x);
+#define DO(x) DO8(x); DO8(x)
 #endif
 
 #ifdef TIMING_NO_LOGS
-#define FOPEN(a, b)     NULL
+#define FOPEN(a, b)        NULL
 #define FPRINTF(a,b,c,d)
 #define FFLUSH(a)
-#define FCLOSE(a)       (void)(a)
+#define FCLOSE(a)          (void)(a)
+#define PRINTLN(fm,b,n,m)  printf(fm "\n", b, n, m)
 #else
-#define FOPEN(a,b)       fopen(a,b)
-#define FPRINTF(a,b,c,d) fprintf(a,b,c,d)
-#define FFLUSH(a)        fflush(a)
-#define FCLOSE(a)        fclose(a)
+#define FOPEN(a,b)         fopen(a,b)
+#define FPRINTF(a,b,c,d)   fprintf(a,b,c,d)
+#define FFLUSH(a)          fflush(a)
+#define FCLOSE(a)          fclose(a)
+#define PRINTLN(fm,b,n,m)  do { printf("\r" fm, b, n, m); fflush(stdout); }while(0)
 #endif
 
 static int should_test(const char *test, int argc, char **argv)
@@ -178,19 +186,20 @@ int main(int argc, char **argv)
                   return EXIT_FAILURE;
                }
             } while (++rr < 100u);
-            printf("Prime-check\t%s(%2d) => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                   name, cnt, CLK_PER_SEC / tt, tt);
+            PRINTLN("Prime-check\t%s(%2d) => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                    name, cnt, CLK_PER_SEC / tt, tt);
          }
       }
    }
 #endif
 
    if (should_test("add", argc, argv) != 0) {
-      log = FOPEN("logs/add.log", "w");
+      log = FOPEN("logs/add" MP_TIMING_VERSION ".log", "w");
       for (cnt = 8; cnt <= 128; cnt += 8) {
          SLEEP;
          mp_rand(&a, cnt);
          mp_rand(&b, cnt);
+         DO8(mp_add(&a, &b, &c));
          rr = 0u;
          tt = UINT64_MAX;
          do {
@@ -200,20 +209,22 @@ int main(int argc, char **argv)
             if (tt > gg)
                tt = gg;
          } while (++rr < 100000u);
-         printf("Adding\t\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+         PRINTLN("Adding\t\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                 mp_count_bits(&a), CLK_PER_SEC / tt, tt);
          FPRINTF(log, "%6d %9" PRIu64 "\n", cnt * MP_DIGIT_BIT, tt);
          FFLUSH(log);
       }
       FCLOSE(log);
+      printf("\n");
    }
 
    if (should_test("sub", argc, argv) != 0) {
-      log = FOPEN("logs/sub.log", "w");
+      log = FOPEN("logs/sub" MP_TIMING_VERSION ".log", "w");
       for (cnt = 8; cnt <= 128; cnt += 8) {
          SLEEP;
          mp_rand(&a, cnt);
          mp_rand(&b, cnt);
+         DO8(mp_sub(&a, &b, &c));
          rr = 0u;
          tt = UINT64_MAX;
          do {
@@ -224,12 +235,13 @@ int main(int argc, char **argv)
                tt = gg;
          } while (++rr < 100000u);
 
-         printf("Subtracting\t\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+         PRINTLN("Subtracting\t\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                 mp_count_bits(&a), CLK_PER_SEC / tt, tt);
          FPRINTF(log, "%6d %9" PRIu64 "\n", cnt * MP_DIGIT_BIT, tt);
          FFLUSH(log);
       }
       FCLOSE(log);
+      printf("\n\n");
    }
 
    if (should_test("mulsqr", argc, argv) != 0) {
@@ -247,11 +259,13 @@ int main(int argc, char **argv)
          MP_TOOM_MUL_CUTOFF = (ix == 2) ? old_toom_m : 9999;
          MP_TOOM_SQR_CUTOFF = (ix == 2) ? old_toom_s : 9999;
 
-         log = FOPEN((ix == 0) ? "logs/mult.log" : (ix == 1) ? "logs/mult_kara.log" : "logs/mult_toom.log", "w");
+         log = FOPEN((ix == 0) ? "logs/mult" MP_TIMING_VERSION ".log" : (ix == 1) ? "logs/mult_kara" MP_TIMING_VERSION ".log" :
+                     "logs/mult_toom" MP_TIMING_VERSION ".log", "w");
          for (cnt = 4; cnt <= (10240 / MP_DIGIT_BIT); cnt += 2) {
             SLEEP;
             mp_rand(&a, cnt);
             mp_rand(&b, cnt);
+            DO8(mp_mul(&a, &b, &c));
             rr = 0u;
             tt = UINT64_MAX;
             do {
@@ -261,17 +275,20 @@ int main(int argc, char **argv)
                if (tt > gg)
                   tt = gg;
             } while (++rr < 100u);
-            printf("Multiplying\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                   mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+            PRINTLN("Multiplying\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                    mp_count_bits(&a), CLK_PER_SEC / tt, tt);
             FPRINTF(log, "%6d %9" PRIu64 "\n", mp_count_bits(&a), tt);
             FFLUSH(log);
          }
          FCLOSE(log);
+         printf("\n");
 
-         log = FOPEN((ix == 0) ? "logs/sqr.log" : (ix == 1) ? "logs/sqr_kara.log" : "logs/sqr_toom.log", "w");
+         log = FOPEN((ix == 0) ? "logs/sqr" MP_TIMING_VERSION ".log" : (ix == 1) ? "logs/sqr_kara" MP_TIMING_VERSION ".log" :
+                     "logs/sqr_toom" MP_TIMING_VERSION ".log", "w");
          for (cnt = 4; cnt <= (10240 / MP_DIGIT_BIT); cnt += 2) {
             SLEEP;
             mp_rand(&a, cnt);
+            DO8(mp_sqr(&a, &b));
             rr = 0u;
             tt = UINT64_MAX;
             do {
@@ -281,12 +298,13 @@ int main(int argc, char **argv)
                if (tt > gg)
                   tt = gg;
             } while (++rr < 100u);
-            printf("Squaring\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                   mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+            PRINTLN("Squaring\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                    mp_count_bits(&a), CLK_PER_SEC / tt, tt);
             FPRINTF(log, "%6d %9" PRIu64 "\n", mp_count_bits(&a), tt);
             FFLUSH(log);
          }
          FCLOSE(log);
+         printf("\n\n");
 
       }
    }
@@ -324,10 +342,10 @@ int main(int argc, char **argv)
          "1214855636816562637502584060163403830270705000634713483015101384881871978446801224798536155406895823305035467591632531067547890948695117172076954220727075688048751022421198712032848890056357845974246560748347918630050853933697792254955890439720297560693579400297062396904306270145886830719309296352765295712183040773146419022875165382778007040109957609739589875590885701126197906063620133954893216612678838507540777138437797705602453719559017633986486649523611975865005712371194067612263330335590526176087004421363598470302731349138773205901447704682181517904064735636518462452242791676541725292378925568296858010151852326316777511935037531017413910506921922450666933202278489024521263798482237150056835746454842662048692127173834433089016107854491097456725016327709663199738238442164843147132789153725513257167915555162094970853584447993125488607696008169807374736711297007473812256272245489405898470297178738029484459690836250560495461579533254473316340608217876781986188705928270735695752830825527963838355419762516246028680280988020401914551825487349990306976304093109384451438813251211051597392127491464898797406789175453067960072008590614886532333015881171367104445044718144312416815712216611576221546455968770801413440778423979",
          NULL
       };
-      log = FOPEN("logs/expt.log", "w");
-      logb = FOPEN("logs/expt_dr.log", "w");
-      logc = FOPEN("logs/expt_2k.log", "w");
-      logd = FOPEN("logs/expt_2kl.log", "w");
+      log = FOPEN("logs/expt" MP_TIMING_VERSION ".log", "w");
+      logb = FOPEN("logs/expt_dr" MP_TIMING_VERSION ".log", "w");
+      logc = FOPEN("logs/expt_2k" MP_TIMING_VERSION ".log", "w");
+      logd = FOPEN("logs/expt_2kl" MP_TIMING_VERSION ".log", "w");
       for (n = 0; primes[n] != NULL; n++) {
          SLEEP;
          mp_read_radix(&a, primes[n], 10);
@@ -340,6 +358,7 @@ int main(int argc, char **argv)
          mp_sub_d(&a, 1uL, &c);
          mp_mod(&b, &c, &b);
          mp_set(&c, 3uL);
+         DO8(mp_exptmod(&c, &b, &a, &d));
          rr = 0u;
          tt = UINT64_MAX;
          do {
@@ -358,8 +377,8 @@ int main(int argc, char **argv)
             draw(&d);
             exit(0);
          }
-         printf("Exponentiating\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+         PRINTLN("Exponentiating\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                 mp_count_bits(&a), CLK_PER_SEC / tt, tt);
          FPRINTF((n < 3) ? logd : (n < 9) ? logc : (n < 16) ? logb : log,
                  "%6d %9" PRIu64 "\n", mp_count_bits(&a), tt);
       }
@@ -367,10 +386,11 @@ int main(int argc, char **argv)
       FCLOSE(logb);
       FCLOSE(logc);
       FCLOSE(logd);
+      printf("\n");
    }
 
    if (should_test("invmod", argc, argv) != 0) {
-      log = FOPEN("logs/invmod.log", "w");
+      log = FOPEN("logs/invmod" MP_TIMING_VERSION ".log", "w");
       for (cnt = 4; cnt <= 32; cnt += 4) {
          SLEEP;
          mp_rand(&a, cnt);
@@ -381,6 +401,7 @@ int main(int argc, char **argv)
             mp_gcd(&a, &b, &c);
          } while (mp_cmp_d(&c, 1uL) != MP_EQ);
 
+         DO2(mp_invmod(&b, &a, &c));
          rr = 0u;
          tt = UINT64_MAX;
          do {
@@ -395,11 +416,12 @@ int main(int argc, char **argv)
             printf("Failed to invert\n");
             return 0;
          }
-         printf("Inverting mod\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles\n",
-                mp_count_bits(&a), CLK_PER_SEC / tt, tt);
+         PRINTLN("Inverting mod\t%4d-bit => %9" PRIu64 "/sec, %9" PRIu64 " cycles",
+                 mp_count_bits(&a), CLK_PER_SEC / tt, tt);
          FPRINTF(log, "%6d %9" PRIu64 "\n", cnt * MP_DIGIT_BIT, tt);
       }
       FCLOSE(log);
+      printf("\n");
    }
 
    return 0;