int main()

in benchmarks/benchmark.c [606:870]


int main(void)
{
  int bmi = full_isa_support();
  int all = 1;

  // Explain the results first if EXPLANATION is set

  #if EXPLANATION
  printf("---------------------------------------------------------------------------------\n");
  printf("Timings in nanoseconds (ns) per call of function, average across input values.\n");
  printf("var = coefficient of variation (stddev / mean) across input values, as percentage.\n");
  printf("corr = correlation coefficient versus the bit density of input values.\n");
  printf("ops/sec = average number of operations per second = 10^9 / average timing.\n");
  printf("ARITHMEAN = arithmetic mean of all average function times, in nanoseconds.\n");
  printf("GEOMEAN = geometric mean of all average function times, in nanoseconds.\n");
  printf("---------------------------------------------------------------------------------\n\n");
  #endif

  // Initialize the random seed to a known but arbitrary value

  srand(1234567);

  // Warm things up? This is a bit ad hoc but may help determinacy

  int i;
  for (i = 0; i < 1000000; ++i) bignum_montmul(12,b0,b1,b2,b3);

  // Now the main tests

  timingtest(all,"bignum_add (4x4->4)",call_bignum_add__4_4);
  timingtest(all,"bignum_add (6x6->6)",call_bignum_add__6_6);
  timingtest(all,"bignum_add (32x32->32)",call_bignum_add__32_32);
  timingtest(all,"bignum_add_p256",call_bignum_add_p256);
  timingtest(all,"bignum_add_p256k1",call_bignum_add_p256k1);
  timingtest(all,"bignum_add_p384",call_bignum_add_p384);
  timingtest(all,"bignum_add_p521",call_bignum_add_p521);
  timingtest(all,"bignum_amontifier (32)",call_bignum_amontifier__32);
  timingtest(all,"bignum_amontmul (32)",call_bignum_amontmul__32);
  timingtest(all,"bignum_amontredc (32/16 -> 16)",call_bignum_amontredc__32_16);
  timingtest(all,"bignum_amontsqr (32 -> 32)",call_bignum_amontsqr__32);
  timingtest(all,"bignum_bigendian_4",call_bignum_bigendian_4);
  timingtest(all,"bignum_bigendian_6",call_bignum_bigendian_6);
  timingtest(all,"bignum_bitfield (32 -> 1)",call_bignum_bitfield__32);
  timingtest(all,"bignum_bitsize (32 -> 1)",call_bignum_bitsize__32);
  timingtest(all,"bignum_cdiv_exact (4x1->4)",call_bignum_cdiv_exact__4_4);
  timingtest(all,"bignum_cdiv_exact (6x1->6)",call_bignum_cdiv_exact__6_6);
  timingtest(all,"bignum_cdiv_exact (32x1->32)",call_bignum_cdiv_exact__32_32);
  timingtest(all,"bignum_cdiv (4x1->4)",call_bignum_cdiv__4_4);
  timingtest(all,"bignum_cdiv (6x1->6)",call_bignum_cdiv__6_6);
  timingtest(all,"bignum_cdiv (32x1->32)",call_bignum_cdiv__32_32);
  timingtest(all,"bignum_cld (32)" ,call_bignum_cld__32);
  timingtest(all,"bignum_clz (32)" ,call_bignum_clz__32);
  timingtest(all,"bignum_cmadd (1x4->4)",call_bignum_cmadd__4_4);
  timingtest(all,"bignum_cmadd (1x6->6)",call_bignum_cmadd__6_6);
  timingtest(all,"bignum_cmadd (1x32->32)",call_bignum_cmadd__32_32);
  timingtest(all,"bignum_cmnegadd (1x4->4)",call_bignum_cmnegadd__4_4);
  timingtest(all,"bignum_cmnegadd (1x6->6)",call_bignum_cmnegadd__6_6);
  timingtest(all,"bignum_cmnegadd (1x32->32)",call_bignum_cmnegadd__32_32);
  timingtest(all,"bignum_cmod (4 -> 1)",call_bignum_cmod__4);
  timingtest(all,"bignum_cmod (6 -> 1)",call_bignum_cmod__6);
  timingtest(all,"bignum_cmod (32 -> 1)",call_bignum_cmod__32);
  timingtest(all,"bignum_cmul (1x4->4)",call_bignum_cmul__4_4);
  timingtest(all,"bignum_cmul (1x6->6)",call_bignum_cmul__6_6);
  timingtest(all,"bignum_cmul (1x32->32)",call_bignum_cmul__32_32);
  timingtest(bmi,"bignum_cmul_p256",call_bignum_cmul_p256);
  timingtest(all,"bignum_cmul_p256_alt",call_bignum_cmul_p256_alt);
  timingtest(bmi,"bignum_cmul_p256k1",call_bignum_cmul_p256k1);
  timingtest(all,"bignum_cmul_p256k1_alt",call_bignum_cmul_p256k1_alt);
  timingtest(bmi,"bignum_cmul_p384",call_bignum_cmul_p384);
  timingtest(all,"bignum_cmul_p384_alt",call_bignum_cmul_p384_alt);
  timingtest(bmi,"bignum_cmul_p521",call_bignum_cmul_p521);
  timingtest(all,"bignum_coprime (4x4)",call_bignum_coprime__4_4);
  timingtest(all,"bignum_coprime (6x6)",call_bignum_coprime__6_6);
  timingtest(all,"bignum_coprime (16x16)",call_bignum_coprime__16_16);
  timingtest(all,"bignum_copy (32 -> 32)" ,call_bignum_copy__32_32);
  timingtest(all,"bignum_ctd (32)" ,call_bignum_ctd__32);
  timingtest(all,"bignum_ctz (32)" ,call_bignum_ctz__32);
  timingtest(bmi,"bignum_deamont_p256",call_bignum_deamont_p256);
  timingtest(all,"bignum_deamont_p256_alt",call_bignum_deamont_p256_alt);
  timingtest(all,"bignum_deamont_p256k1",call_bignum_deamont_p256k1);
  timingtest(bmi,"bignum_deamont_p384",call_bignum_deamont_p384);
  timingtest(all,"bignum_deamont_p384_alt",call_bignum_deamont_p384_alt);
  timingtest(all,"bignum_deamont_p521",call_bignum_deamont_p521);
  timingtest(all,"bignum_demont (32 -> 32)" ,call_bignum_demont__32);
  timingtest(bmi,"bignum_demont_p256",call_bignum_demont_p256);
  timingtest(all,"bignum_demont_p256_alt",call_bignum_demont_p256_alt);
  timingtest(all,"bignum_demont_p256k1",call_bignum_demont_p256k1);
  timingtest(bmi,"bignum_demont_p384",call_bignum_demont_p384);
  timingtest(all,"bignum_demont_p384_alt",call_bignum_demont_p384_alt);
  timingtest(all,"bignum_demont_p521",call_bignum_demont_p521);
  timingtest(all,"bignum_digit (32 -> 1)",call_bignum_digit__32);
  timingtest(all,"bignum_digitsize (32)" ,call_bignum_digitsize__32);
  timingtest(all,"bignum_divmod10 (32 -> 32)",call_bignum_divmod10__32);
  timingtest(all,"bignum_double_p256",call_bignum_double_p256);
  timingtest(all,"bignum_double_p256k1",call_bignum_double_p256k1);
  timingtest(all,"bignum_double_p384",call_bignum_double_p384);
  timingtest(all,"bignum_double_p521",call_bignum_double_p521);
  timingtest(all,"bignum_emontredc (8 -> 4)",call_bignum_emontredc__4);
  timingtest(all,"bignum_emontredc (12 -> 6)",call_bignum_emontredc__6);
  timingtest(all,"bignum_emontredc (64 -> 32)",call_bignum_emontredc__32);
  timingtest(bmi,"bignum_emontredc_8n (64 -> 32)",call_bignum_emontredc_8n__32);
  timingtest(all,"bignum_eq (32x32)" ,call_bignum_eq__32_32);
  timingtest(all,"bignum_even (32)" ,call_bignum_even__32);
  timingtest(all,"bignum_frombebytes_4",call_bignum_frombebytes_4);
  timingtest(all,"bignum_frombebytes_6",call_bignum_frombebytes_6);
  timingtest(all,"bignum_fromlebytes_4",call_bignum_fromlebytes_4);
  timingtest(all,"bignum_fromlebytes_6",call_bignum_fromlebytes_6);
  timingtest(all,"bignum_ge (32x32)" ,call_bignum_ge__32_32);
  timingtest(all,"bignum_gt (32x32)" ,call_bignum_gt__32_32);
  timingtest(all,"bignum_half_p256",call_bignum_half_p256);
  timingtest(all,"bignum_half_p256k1",call_bignum_half_p256k1);
  timingtest(all,"bignum_half_p384",call_bignum_half_p384);
  timingtest(all,"bignum_half_p521",call_bignum_half_p521);
  timingtest(all,"bignum_iszero (32)" ,call_bignum_iszero__32);
  timingtest(bmi,"bignum_kmul_16_32",call_bignum_kmul_16_32);
  timingtest(bmi,"bignum_kmul_32_64",call_bignum_kmul_32_64);
  timingtest(bmi,"bignum_ksqr_16_32",call_bignum_ksqr_16_32);
  timingtest(bmi,"bignum_ksqr_32_64",call_bignum_ksqr_32_64);
  timingtest(all,"bignum_le (32x32)" ,call_bignum_le__32_32);
  timingtest(all,"bignum_littleendian_4",call_bignum_littleendian_4);
  timingtest(all,"bignum_littleendian_6",call_bignum_littleendian_6);
  timingtest(all,"bignum_lt (32x32)" ,call_bignum_lt__32_32);
  timingtest(all,"bignum_madd (4x4 -> 8)",call_bignum_madd__4_8);
  timingtest(all,"bignum_madd (6x6 -> 12)",call_bignum_madd__6_12);
  timingtest(all,"bignum_madd (8x8 -> 16)",call_bignum_madd__8_16);
  timingtest(all,"bignum_madd (16x16 -> 32)",call_bignum_madd__16_32);
  timingtest(all,"bignum_madd (32x32 -> 64)",call_bignum_madd__32_64);
  timingtest(bmi,"bignum_mod_n256 (8 -> 4)",call_bignum_mod_n256__8);
  timingtest(all,"bignum_mod_n256_alt (8 -> 4)",call_bignum_mod_n256_alt__8);
  timingtest(all,"bignum_mod_n256_4",call_bignum_mod_n256_4);
  timingtest(all,"bignum_mod_n256k1_4",call_bignum_mod_n256k1_4);
  timingtest(bmi,"bignum_mod_n384 (12 -> 6)",call_bignum_mod_n384__12);
  timingtest(all,"bignum_mod_n384_alt (12 -> 6)",call_bignum_mod_n384_alt__12);
  timingtest(all,"bignum_mod_n384_6",call_bignum_mod_n384_6);
  timingtest(bmi,"bignum_mod_n521_9",call_bignum_mod_n521_9);
  timingtest(bmi,"bignum_mod_p256 (8 -> 4)",call_bignum_mod_p256__8);
  timingtest(all,"bignum_mod_p256_alt (8 -> 4)",call_bignum_mod_p256_alt__8);
  timingtest(all,"bignum_mod_p256_4",call_bignum_mod_p256_4);
  timingtest(all,"bignum_mod_p256k1_4",call_bignum_mod_p256k1_4);
  timingtest(bmi,"bignum_mod_p384 (12 -> 6)",call_bignum_mod_p384__12);
  timingtest(all,"bignum_mod_p384_alt (12 -> 6)",call_bignum_mod_p384_alt__12);
  timingtest(all,"bignum_mod_p384_6",call_bignum_mod_p384_6);
  timingtest(all,"bignum_mod_p521_9",call_bignum_mod_p521_9);
  timingtest(all,"bignum_modadd (32 -> 32)" ,call_bignum_modadd__32);
  timingtest(all,"bignum_moddouble (32 -> 32)" ,call_bignum_moddouble__32);
  timingtest(all,"bignum_modifier (32)",call_bignum_modifier__32);
  timingtest(all,"bignum_modinv (4x4 -> 4)",call_bignum_modinv__4);
  timingtest(all,"bignum_modinv (6x6 -> 6)",call_bignum_modinv__6);
  timingtest(all,"bignum_modinv (16x16 -> 16)",call_bignum_modinv__16);
  timingtest(all,"bignum_modoptneg (32 -> 32)",call_bignum_modoptneg__32);
  timingtest(all,"bignum_modsub (32 -> 32)" ,call_bignum_modsub__32);
  timingtest(all,"bignum_montifier (32)",call_bignum_montifier__32);
  timingtest(all,"bignum_montmul (32x32 -> 32)" ,call_bignum_montmul__32);
  timingtest(bmi,"bignum_montmul_p256",call_bignum_montmul_p256);
  timingtest(all,"bignum_montmul_p256_alt",call_bignum_montmul_p256_alt);
  timingtest(bmi,"bignum_montmul_p256k1",call_bignum_montmul_p256k1);
  timingtest(all,"bignum_montmul_p256k1_alt",call_bignum_montmul_p256k1_alt);
  timingtest(bmi,"bignum_montmul_p384",call_bignum_montmul_p384);
  timingtest(all,"bignum_montmul_p384_alt",call_bignum_montmul_p384_alt);
  timingtest(bmi,"bignum_montmul_p521",call_bignum_montmul_p521);
  timingtest(all,"bignum_montredc (32/16 -> 16)",call_bignum_montredc__32_16);
  timingtest(all,"bignum_montsqr (32 -> 32)" ,call_bignum_montsqr__32);
  timingtest(bmi,"bignum_montsqr_p256",call_bignum_montsqr_p256);
  timingtest(all,"bignum_montsqr_p256_alt",call_bignum_montsqr_p256_alt);
  timingtest(bmi,"bignum_montsqr_p256k1",call_bignum_montsqr_p256k1);
  timingtest(all,"bignum_montsqr_p256k1_alt",call_bignum_montsqr_p256k1_alt);
  timingtest(bmi,"bignum_montsqr_p384",call_bignum_montsqr_p384);
  timingtest(all,"bignum_montsqr_p384_alt",call_bignum_montsqr_p384_alt);
  timingtest(bmi,"bignum_montsqr_p521",call_bignum_montsqr_p521);
  timingtest(all,"bignum_mul (4x4 -> 8)",call_bignum_mul__4_8);
  timingtest(all,"bignum_mul (6x6 -> 12)",call_bignum_mul__6_12);
  timingtest(all,"bignum_mul (8x8 -> 16)",call_bignum_mul__8_16);
  timingtest(all,"bignum_mul (16x16 -> 32)",call_bignum_mul__16_32);
  timingtest(all,"bignum_mul (32x32 -> 64)",call_bignum_mul__32_64);
  timingtest(bmi,"bignum_mul_4_8",call_bignum_mul_4_8);
  timingtest(all,"bignum_mul_4_8_alt",call_bignum_mul_4_8_alt);
  timingtest(bmi,"bignum_mul_6_12",call_bignum_mul_6_12);
  timingtest(all,"bignum_mul_6_12_alt",call_bignum_mul_6_12_alt);
  timingtest(bmi,"bignum_mul_8_16",call_bignum_mul_8_16);
  timingtest(bmi,"bignum_mul_p256k1",call_bignum_mul_p256k1);
  timingtest(all,"bignum_mul_p256k1_alt",call_bignum_mul_p256k1_alt);
  timingtest(bmi,"bignum_mul_p521",call_bignum_mul_p521);
  timingtest(all,"bignum_muladd10 (32 -> 32)",call_bignum_muladd10__32);
  timingtest(all,"bignum_mux16 (4 -> 4)",call_bignum_mux16__4);
  timingtest(all,"bignum_mux16 (6 -> 6)",call_bignum_mux16__6);
  timingtest(all,"bignum_mux16 (32 -> 32)",call_bignum_mux16__32);
  timingtest(all,"bignum_mux_4",call_bignum_mux_4);
  timingtest(all,"bignum_mux_6",call_bignum_mux_6);
  timingtest(all,"bignum_neg_p256",call_bignum_neg_p256);
  timingtest(all,"bignum_neg_p256k1",call_bignum_neg_p256k1);
  timingtest(all,"bignum_neg_p384",call_bignum_neg_p384);
  timingtest(all,"bignum_neg_p521",call_bignum_neg_p521);
  timingtest(all,"bignum_negmodinv (32)" ,call_bignum_negmodinv__32);
  timingtest(all,"bignum_nonzero (32)" ,call_bignum_nonzero__32);
  timingtest(all,"bignum_nonzero_4",call_bignum_nonzero_4);
  timingtest(all,"bignum_nonzero_6",call_bignum_nonzero_6);
  timingtest(all,"bignum_normalize (32 -> 32)",call_bignum_normalize__32);
  timingtest(all,"bignum_odd (32)" ,call_bignum_odd__32);
  timingtest(all,"bignum_of_word (1 -> 32)",call_bignum_of_word__32);
  timingtest(all,"bignum_optadd (32x32 -> 32)" ,call_bignum_optadd__32);
  timingtest(all,"bignum_optneg (32 -> 32)" ,call_bignum_optneg__32);
  timingtest(all,"bignum_optneg_p256",call_bignum_optneg_p256);
  timingtest(all,"bignum_optneg_p256k1",call_bignum_optneg_p256k1);
  timingtest(all,"bignum_optneg_p384",call_bignum_optneg_p384);
  timingtest(all,"bignum_optneg_p521",call_bignum_optneg_p521);
  timingtest(all,"bignum_optsub (32x32 -> 32)",call_bignum_optsub__32);
  timingtest(all,"bignum_optsubadd (32x32 -> 32)",call_bignum_optsubadd__32);
  timingtest(all,"bignum_pow2 (32)" ,call_bignum_pow2__32);
  timingtest(all,"bignum_shl_small (32 -> 32)",call_bignum_shl_small__32_32);
  timingtest(all,"bignum_shr_small (32 -> 32)",call_bignum_shr_small__32_32);
  timingtest(all,"bignum_sqr (4 -> 8)",call_bignum_sqr__4_8);
  timingtest(all,"bignum_sqr (6 -> 12)",call_bignum_sqr__6_12);
  timingtest(all,"bignum_sqr (8 -> 16)",call_bignum_sqr__8_16);
  timingtest(all,"bignum_sqr (16 -> 32)",call_bignum_sqr__16_32);
  timingtest(all,"bignum_sqr (32 -> 64)",call_bignum_sqr__32_64);
  timingtest(bmi,"bignum_sqr_4_8",call_bignum_sqr_4_8);
  timingtest(all,"bignum_sqr_4_8_alt",call_bignum_sqr_4_8_alt);
  timingtest(bmi,"bignum_sqr_6_12",call_bignum_sqr_6_12);
  timingtest(all,"bignum_sqr_6_12_alt",call_bignum_sqr_6_12_alt);
  timingtest(bmi,"bignum_sqr_8_16",call_bignum_sqr_8_16);
  timingtest(bmi,"bignum_sqr_p256k1",call_bignum_sqr_p256k1);
  timingtest(all,"bignum_sqr_p256k1_alt",call_bignum_sqr_p256k1_alt);
  timingtest(bmi,"bignum_sqr_p521",call_bignum_sqr_p521);
  timingtest(all,"bignum_sub (4x4->4)",call_bignum_sub__4_4);
  timingtest(all,"bignum_sub (6x6->6)",call_bignum_sub__6_6);
  timingtest(all,"bignum_sub (32x32->32)",call_bignum_sub__32_32);
  timingtest(all,"bignum_sub_p256",call_bignum_sub_p256);
  timingtest(all,"bignum_sub_p256k1",call_bignum_sub_p256k1);
  timingtest(all,"bignum_sub_p384",call_bignum_sub_p384);
  timingtest(all,"bignum_sub_p521",call_bignum_sub_p521);
  timingtest(all,"bignum_tobebytes_4",call_bignum_tobebytes_4);
  timingtest(all,"bignum_tobebytes_6",call_bignum_tobebytes_6);
  timingtest(all,"bignum_tolebytes_4",call_bignum_tolebytes_4);
  timingtest(all,"bignum_tolebytes_6",call_bignum_tolebytes_6);
  timingtest(bmi,"bignum_tomont_p256",call_bignum_tomont_p256);
  timingtest(all,"bignum_tomont_p256_alt",call_bignum_tomont_p256_alt);
  timingtest(bmi,"bignum_tomont_p256k1",call_bignum_tomont_p256k1);
  timingtest(all,"bignum_tomont_p256k1_alt",call_bignum_tomont_p256k1_alt);
  timingtest(bmi,"bignum_tomont_p384",call_bignum_tomont_p384);
  timingtest(all,"bignum_tomont_p384_alt",call_bignum_tomont_p384_alt);
  timingtest(all,"bignum_tomont_p521",call_bignum_tomont_p521);
  timingtest(bmi,"bignum_triple_p256",call_bignum_triple_p256);
  timingtest(all,"bignum_triple_p256_alt",call_bignum_triple_p256_alt);
  timingtest(bmi,"bignum_triple_p256k1",call_bignum_triple_p256k1);
  timingtest(all,"bignum_triple_p256k1_alt",call_bignum_triple_p256k1_alt);
  timingtest(bmi,"bignum_triple_p384",call_bignum_triple_p384);
  timingtest(all,"bignum_triple_p384_alt",call_bignum_triple_p384_alt);
  timingtest(bmi,"bignum_triple_p521",call_bignum_triple_p521);
  timingtest(all,"word_bytereverse",call_word_bytereverse);
  timingtest(all,"word_clz",call_word_clz);
  timingtest(all,"word_ctz",call_word_ctz);
  timingtest(all,"word_max",call_word_max);
  timingtest(all,"word_min",call_word_min);
  timingtest(all,"word_negmodinv",call_word_negmodinv);
  timingtest(all,"word_recip",call_word_recip);

  // Summarize performance in arithmetic and geometric means

  arithmean /= (double) tests;
  geomean /= (double) tests; geomean = exp(geomean);
  printf("ARITHMEAN (%3d tests)    : %6.1f ns\n",tests,arithmean);
  printf("GEOMEAN   (%3d tests)    : %6.1f ns\n",tests,geomean);

  return 0;
}