Browse Source

add mul_bench.c, make base-independent code for exponentiation.

tested with base B = 2, 4, 8.
Michele Orrù 7 years ago
parent
commit
a8df3075a4
7 changed files with 69 additions and 24 deletions
  1. 6 1
      configure.ac
  2. 2 1
      src/Makefile.am
  3. 2 4
      src/exp_bench.c
  4. 18 13
      src/fbase.c
  5. 9 3
      src/fbase.h
  6. 30 0
      src/mul_bench.c
  7. 2 2
      src/rms.c

+ 6 - 1
configure.ac

@@ -23,6 +23,7 @@ AC_GNU_SOURCE
 AC_CHECK_HEADERS([limits.h stdint.h stdlib.h string.h unistd.h])
 AC_CHECK_SIZEOF(mp_limb_t, 8, [#include <gmp.h>])
 AC_CHECK_SIZEOF(uint32_t, 4, [#include <stdint.h>])
+AC_CHECK_SIZEOF(unsigned long long, 8, [])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_TYPE_SIZE_T
@@ -43,10 +44,14 @@ AC_SUBST([AM_MAKEFLAGS], [--no-print-directory])
 
 AC_ARG_ENABLE(debug,
    AS_HELP_STRING([--enable-debug], [enable debugging, default: no]),
-   CFLAGS+=" -UNDEBUG -O3 -ggdb -fbounds-check -D_FORTIFY_SOURCE=1",
+   CFLAGS+=" -UNDEBUG -O0 -ggdb -fbounds-check -D_FORTIFY_SOURCE=1",
    CFLAGS+=" -DNDEBUG -O3 -march=native")
 
 
+AC_DEFINE([ERROR],  [16], [log inverse of the error probability, default: 16.])
+AC_DEFINE([FB_BASE], [8], [log of precomputed base for group operation, default: 8.])
+AC_DEFINE([SS_BASE], [1], [log of secret shares representation, default: 1.])
+
 AC_OUTPUT([Makefile
            src/Makefile
            ])

+ 2 - 1
src/Makefile.am

@@ -1,4 +1,4 @@
-bin_PROGRAMS = rms ddlog_bench exp_bench
+bin_PROGRAMS = rms ddlog_bench exp_bench mul_bench
 check_PROGRAMS = group_test
 
 DDLOG = ddlog.c ddlog.h
@@ -15,3 +15,4 @@ group_test_SOURCES = group_test.c $(GROUP) $(ENTROPY)
 rms_SOURCES = rms.c $(DDLOG) $(ELGAMAL) $(ENTROPY) $(GROUP) $(FBASE) $(HSS) $(TIMEIT)
 ddlog_bench_SOURCES = ddlog_bench.c $(DDLOG) $(ENTROPY) $(GROUP) $(TIMEIT)
 exp_bench_SOURCES = exp_bench.c $(ENTROPY) $(GROUP) $(FBASE) $(TIMEIT)
+mul_bench_SOURCES = mul_bench.c $(ENTROPY) $(GROUP)

+ 2 - 4
src/exp_bench.c

@@ -24,7 +24,6 @@ int main()
   mpz_powm_ui(expected_mod, base, 2, p);
   mpz_pow_ui(test, base, 2);
   remp(test);
-  // gmp_printf("%Zx\n%Zx\n", test, expected_mod);
   assert(!mpz_cmp(test, expected_mod));
   mpz_clear(expected_mod);
 
@@ -33,9 +32,8 @@ int main()
   fb_set(pbase, base);
 
   INIT_TIMEIT(CLOCK_PROCESS_CPUTIME_ID);
-  for (int i = 0; i < (int) 1e6; i++) {
-    getrandom(&exp, 4, GRND_NONBLOCK);
-    //exp =0xffff;
+  for (int i = 0; i < (int) 1e4; i++) {
+    getrandom(&exp, 8, GRND_NONBLOCK);
 
     mpz_powm_ui(expected, base, exp, p);
     START_TIMEIT();

+ 18 - 13
src/fbase.c

@@ -1,3 +1,5 @@
+#include "config.h"
+
 #include <stdint.h>
 #include <stdlib.h>
 
@@ -12,7 +14,7 @@ fbase_ptr fb_init()
   fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit));
 
   for (size_t j = 0; j < FB_FRAMES; j++) {
-    for (size_t i = 0; i <= 0xFF; i++) {
+    for (size_t i = 0; i <= FB_MASK; i++) {
       mpz_init(pb[j][i]);
     }
   }
@@ -23,10 +25,12 @@ void fb_set_small(fbase_t pb, const mpz_t n)
 {
   mpz_t e;
   mpz_init(e);
-  for (size_t j = 0; j < FB_FRAMES/2; j++) {
-    for (size_t i = 0; i <= 0xFF; i++) {
-      uint64_t e =  (0x01 <<  8*j) * i;
+  for (size_t j = 0; j < (FB_FRAMES)/2; j++) {
+    for (size_t i = 0; i <= FB_MASK; i++) {
+      uint64_t e =  (0x01 <<  (FB_BASE)*j) * i;
       powmp_ui(pb[j][i], n, e);
+
+      /* force size to be constant. */
       _mpz_realloc(pb[j][i], 24);
       SIZ(pb[j][i]) = 24;
 
@@ -38,8 +42,10 @@ void fb_set_small(fbase_t pb, const mpz_t n)
 void fb_copy(fbase_t dst, fbase_t source)
 {
   for (size_t j = 0; j < FB_FRAMES; j++) {
-    for (size_t i = 0; i <= 0xFF; i++) {
+    for (size_t i = 0; i <= FB_MASK; i++) {
       mpz_set(dst[j][i], source[j][i]);
+
+      /* force size to be constant */
       _mpz_realloc(dst[j][i], 24);
       SIZ(dst[j][i]) = 24;
     }
@@ -51,9 +57,9 @@ void fb_set(fbase_t pb, const mpz_t n)
   mpz_t e;
   mpz_init(e);
   for (size_t j = 0; j < FB_FRAMES; j++) {
-    for (size_t i = 0; i <= 0xFF; i++) {
+    for (size_t i = 0; i <= FB_MASK; i++) {
       mpz_set_ui(e, 1);
-      mpz_mul_2exp(e, e, 8*j);
+      mpz_mul_2exp(e, e, (FB_BASE)*j);
       mpz_mul_ui(e, e, i);
 
       mpz_powm(pb[j][i], n, e, p);
@@ -66,7 +72,7 @@ void fb_clear(fbase_t pb)
 {
 
   for (size_t j = 0; j < FB_FRAMES; j++) {
-    for (size_t i = 0; i <= 0xFF; i++) {
+    for (size_t i = 0; i <= FB_MASK; i++) {
       mpz_clear(pb[j][i]);
     }
   }
@@ -77,13 +83,12 @@ void fb_clear(fbase_t pb)
 void __attribute__((optimize("unroll-loops")))
 fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp)
 {
-  const uint8_t *e = (uint8_t *) &exp;
+#define e(i) ((exp >> (i * (FB_BASE))) & (FB_MASK))
 
-  mpz_mul_modp(rop, pb[0][e[0]], pb[1][e[1]]);
+  mpz_mul_modp(rop, pb[0][e(0)], pb[1][e(1)]);
   for (size_t j = 2; j < FB_FRAMES; j++) {
-    const size_t exp = e[j];
-    if (exp != 0) {
-      mpz_mul_modp(rop, rop,  pb[j][exp]);
+    if (e(j) != 0) {
+      mpz_mul_modp(rop, rop,  pb[j][e(j)]);
     }
   }
 }

+ 9 - 3
src/fbase.h

@@ -1,12 +1,15 @@
 #pragma once
+#include "config.h"
 
 #include <gmp.h>
 #include <stdint.h>
 
 #include "group.h"
 
-#define FB_FRAMES 8
-typedef mpz_t fbase_unit[256];
+#define FB_FRAMES (64/(FB_BASE))
+#define FB_MASK   ((1 << (FB_BASE)) - 1)
+
+typedef mpz_t        fbase_unit[1 << FB_BASE];
 typedef fbase_unit   fbase_t[FB_FRAMES];
 typedef fbase_unit  *fbase_ptr;
 
@@ -18,4 +21,7 @@ void fb_set_small(fbase_t pb, const mpz_t n);
 void fb_clear(fbase_t pb);
 void fb_copy(fbase_t source, fbase_t dst);
 
-#define fb_init_set(pb, base) fb_init(pb); fb_set(pb, base)
+#define fb_init_set(pb, base)                   \
+  do {                                          \
+    fb_init(pb); fb_set(pb, base);              \
+  } while(0)

+ 30 - 0
src/mul_bench.c

@@ -0,0 +1,30 @@
+#include <assert.h>
+#include <stdio.h>
+
+#include <gmp.h>
+
+#include "entropy.h"
+#include "group.h"
+#include "timeit.h"
+
+int main()
+{
+  mpz_entropy_init();
+  group_init();
+  mpz_t test, expected, x, y;
+  mpz_inits(test, expected, x, y, NULL);
+
+  INIT_TIMEIT(CLOCK_PROCESS_CPUTIME_ID);
+  for (int i = 0; i < (int) 1e6; i++) {
+    mpz_urandomm(x, _rstate, p);
+    mpz_urandomm(y, _rstate, p);
+
+    START_TIMEIT();
+    mul_modp(expected, x, y);
+    END_TIMEIT();
+
+  }
+  printf(TIMEIT_FORMAT "\n", GET_TIMEIT());
+
+  mpz_clears(test, expected, x, y, NULL);
+}

+ 2 - 2
src/rms.c

@@ -26,6 +26,7 @@ uint32_t mul_single(const elgamal_cipher_t c,
   mpz_t op1, op2;
   mpz_inits(op1, op2, NULL);
 
+  START_TIMEIT();
   /* c1: first block */
   fb_powmp_ui(op1, c->fb_c1, cx->_mp_d[0]);
   /* c1: second block */
@@ -37,10 +38,9 @@ uint32_t mul_single(const elgamal_cipher_t c,
   /* c2 */
   fb_powmp_ui(op2, c->fb_c2, x);
   mpz_mul_modp(op2, op2, op1);
+  END_TIMEIT();
 
-  START_TIMEIT();
   const uint32_t converted = convert(PTR(op2));
-  END_TIMEIT();
 
   mpz_clears(op1, op2, NULL);
   return converted;