-
Notifications
You must be signed in to change notification settings - Fork 16
/
bench_ntt.c
149 lines (122 loc) · 3.46 KB
/
bench_ntt.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
/**
@file bench_ntt.c
*/
#include "defines.h"
#if defined(SE_ENABLE_TIMERS)
#include <stdbool.h>
#include <stdio.h>
#include "bench_common.h"
#include "ckks_common.h"
#include "fileops.h"
#include "ntt.h"
#include "parameters.h"
#include "timer.h"
#include "util_print.h"
// -- Configuration
// #define SE_BENCH_NTT_ROOTS
// #define SE_BENCH_NTT_COMP
#define SE_BENCH_NTT_FULL
// -- Sanity check
#if !defined(SE_BENCH_NTT_ROOTS) && !defined(SE_BENCH_NTT_COMP) && !defined(SE_BENCH_NTT_FULL)
#define SE_BENCH_NTT_ROOTS
#endif
#ifndef SE_USE_MALLOC
#ifdef SE_NTT_FAST
#define NTT_TESTS_ROOTS_MEM 2 * SE_DEGREE_N
#elif defined(SE_NTT_REG) || defined(SE_NTT_ONE_SHOT)
#define NTT_TESTS_ROOTS_MEM SE_DEGREE_N
#else
#define NTT_TESTS_ROOTS_MEM 0
#endif
#endif
void bench_ntt(void)
{
#ifdef SE_USE_MALLOC
const PolySizeType n = 4096;
#else
const PolySizeType n = SE_DEGREE_N;
#endif
const size_t vec_size = n;
#ifdef SE_USE_MALLOC
#ifdef SE_NTT_FAST
size_t ntt_roots_size = 2 * n;
#elif defined(SE_NTT_OTF)
size_t ntt_roots_size = 0;
#else
size_t ntt_roots_size = n;
#endif
size_t mempool_size = vec_size + ntt_roots_size;
ZZ *mempool = calloc(mempool_size, sizeof(ZZ));
#else
ZZ mempool[SE_DEGREE_N + NTT_TESTS_ROOTS_MEM];
memset(&mempool, 0, (SE_DEGREE_N + NTT_TEST_ROOTS_MEM) * sizeof(ZZ));
#endif
ZZ *vec = mempool;
#ifdef SE_NTT_OTF
ZZ *ntt_roots = 0;
#else
ZZ *ntt_roots = &(mempool[vec_size]);
#endif
Parms parms;
parms.nprimes = 1;
ckks_setup(n, 1, NULL, &parms);
#ifdef SE_BENCH_NTT_ROOTS
const char *bench_name = "ntt (timing roots load/gen)";
#elif defined(SE_BENCH_NTT_COMP)
const char *bench_name = "ntt (timing computation)";
#else
const char *bench_name = "ntt (timing roots + computation)";
#endif
print_bench_banner(bench_name, &parms);
Timer timer;
const size_t COUNT = 10;
float t_total = 0, t_min = 0, t_max = 0, t_curr = 0;
for (size_t b_itr = 0; b_itr < COUNT + 1; b_itr++)
{
t_curr = 0;
random_zzq_poly(vec, n, parms.curr_modulus);
#ifdef SE_NTT_FAST
se_secure_zero_memset(ntt_roots, n * sizeof(ZZ) * 2);
#elif defined(SE_NTT_REG) || defined(SE_NTT_ONE_SHOT)
se_secure_zero_memset(ntt_roots, n * sizeof(ZZ));
#endif
#if defined(SE_BENCH_NTT_ROOTS) || defined(SE_BENCH_NTT_FULL)
printf("curr runtime (us) = %0.2f\n", t_curr);
reset_start_timer(&timer);
#endif
// -- Load or generate the roots
ntt_roots_initialize(&parms, ntt_roots);
#ifdef SE_BENCH_NTT_ROOTS
stop_timer(&timer);
t_curr += read_timer(timer, MICRO_SEC);
#elif defined(SE_BENCH_NTT_COMP)
reset_start_timer(&timer);
#endif
// -- Ntt computation
ntt_inpl(&parms, ntt_roots, vec);
#if defined(SE_BENCH_NTT_COMP) || defined(SE_BENCH_NTT_FULL)
stop_timer(&timer);
t_curr += read_timer(timer, MICRO_SEC);
#endif
if (b_itr) set_print_time_vals(bench_name, t_curr, b_itr, &t_total, &t_min, &t_max);
print_poly_full("ntt(vec)", vec, n);
}
print_time_vals(bench_name, t_curr, COUNT, &t_total, &t_min, &t_max);
print_bench_banner(bench_name, &parms);
#ifdef SE_USE_MALLOC
if (mempool)
{
free(mempool);
mempool = 0;
}
#endif
delete_parameters(&parms);
}
#endif
#ifdef SE_USE_MALLOC
#ifdef NTT_TESTS_ROOTS_MEM
#undef NTT_TESTS_ROOTS_MEM
#endif
#endif