Commit Graph

86 Commits

Author SHA1 Message Date
Quentin Bourgerie
dea1be9d52 feat(compiler): HLFHELinalg.apply_lookup_table definition 2021-10-29 12:17:38 +02:00
Quentin Bourgerie
f72d51d98d feat(compiler): HLFHELinalg.mul_eint_int 2021-10-29 12:17:38 +02:00
Quentin Bourgerie
64e327209f feat(compiler): HLFHELinalg.sub_int_eint 2021-10-29 12:17:32 +02:00
Quentin Bourgerie
3b02a16f7b feat(compiler): HLFHELinalg.add_eint definition 2021-10-29 12:16:41 +02:00
Quentin Bourgerie
0d4e10169b feat(compiler): Introduce the HLFHELinalg dialect and a first operator HLFHELinalg.add_eint_int 2021-10-29 12:16:41 +02:00
Quentin Bourgerie
247cc489c5 refactor(compiler): Refactor JITLambda::Argument::setArg 2021-10-21 14:40:07 +02:00
Quentin Bourgerie
d93da5bdc0 enhance(compiler): Handle tensor.extract_slice and tensor.insert_slice in the FHE lowering #168 2021-10-15 16:47:35 +02:00
Quentin Bourgerie
3b2f21a715 enhance(compiler): Handle multi-dimensional tensor #167 2021-10-15 16:44:19 +02:00
youben11
6204f93878 fix: call getChecked to better handle failure 2021-10-12 16:57:18 +02:00
youben11
2972fa4403 refactor(python): rework the bindings with latest MLIR version
- Go through CAPI for python bindings
- Consuming LLVM errors in CAPI: fixes previous issue which made this
  impossible in the python bindings
2021-10-07 14:38:50 +01:00
youben11
09ad814e95 fix: use ref to PatternRewriter in NativeCodeCall 2021-10-07 14:38:50 +01:00
youben11
7a48900fae chore: build zamacompiler as an LLVM external proj 2021-10-07 14:38:50 +01:00
Andi Drebes
2acfa63eb7 feat(compiler): Determine FHE circuit constraints instead of using default values
This replaces the default FHE circuit constrains (maximum encrypted
integer width of 7 bits and a Minimal Arithmetic Noise Padding of 10
with the results of the `MaxMANP` pass, which determines these values
automatically from the input program.

Since the maximum encrypted integer width and the maximum value for
the Minimal Arithmetic Noise Padding can only be derived from HLFHE
operations, the circuit constraints are determined automatically by
`zamacompiler` only if the option `--entry-dialect=hlfhe` was
specified.

For lower-level dialects, `zamacompiler` has been provided with the
options `--assume-max-eint-precision=...` and `--assume-max-manp=...`
that allow a user to specify the values for the maximum required
precision and maximum values for the Minimal Arithmetic Noise Padding.
2021-09-28 11:35:58 +02:00
Andi Drebes
5ce3fd5f43 refactor(compiler): Move ceilLog2 to separate header file 2021-09-28 11:35:58 +02:00
Andi Drebes
1200a46e49 feat(compiler): Add HLFHE pass selecting maximum MANP and encrypted integer width
This pass calculates the squared Minimal Arithmetic Noise Padding
(MANP) for each operation using the MANP pass and extracts the maximum
(non-squared) Minimal Arithmetic Noise Padding and the maximum
ecrypted integer width from.
2021-09-28 11:35:58 +02:00
Andi Drebes
54661528a8 feat(compiler): Add action dump-hlfhe-manp
The new option --acion=dump-hlfhe-manp invokes the Minimal Arithmetic
Noise Padding Analysis pass based on the squared 2-norm metric from
`lib/Dialect/HLFHE/Analysis/MANP.cpp` and dumps the module afterwards
with an extra attribute `MANP` for each HLFHE operation.
2021-09-28 11:35:58 +02:00
Andi Drebes
ed762942c1 feat(compiler): Add pass for Minimal Arithmetic Noise Padding
This pass calculates the squared Minimal Arithmetic Noise Padding
(MANP) for each operation of a function and stores the result in an
integer attribute named "sqMANP". This metric is identical to the
squared 2-norm of the constant vector of an equivalent dot product
between a vector of encrypted integers resulting directly from an
encryption and a vector of plaintext constants.

The pass supports the following operations:

 - HLFHE.dot_eint_int
 - HLFHE.zero
 - HLFHE.add_eint_int
 - HLFHE.add_eint
 - HLFHE.sub_int_eint
 - HLFHE.mul_eint_int
 - HLFHE.apply_lookup_table

If any other operation is encountered, the pass conservatively
fails. The pass further makes the optimistic assumption that all
values passed to a function are either the direct result of an
encryption of a noise-refreshing operation.
2021-09-28 11:35:58 +02:00
Andi Drebes
30374ebb2c refactor(compiler): Introduce compilation pipeline with multiple entries / exits
This refactoring commit restructures the compilation pipeline of
`zamacompiler`, such that it is possible to enter and exit the
pipeline at different points, effectively defining the level of
abstraction at the input and the required level of abstraction for the
output.

The entry point is specified using the `--entry-dialect`
argument. Valid choices are:

  `--entry-dialect=hlfhe`:   Source contains HLFHE operations
  `--entry-dialect=midlfhe`: Source contains MidLFHE operations
  `--entry-dialect=lowlfhe`: Source contains LowLFHE operations
  `--entry-dialect=std`:     Source does not contain any FHE Operations
  `--entry-dialect=llvm`:    Source is in LLVM dialect

The exit point is defined by an action, specified using --action.

  `--action=roundtrip`:
     Parse the source file to in-memory representation and immediately
     dump as text without any processing

  `--action=dump-midlfhe`:
     Lower source to MidLFHE and dump result as text

  `--action=dump-lowlfhe`:
     Lower source to LowLFHE and dump result as text

  `--action=dump-std`:
     Lower source to only standard MLIR dialects (i.e., all FHE
     operations have already been lowered)

  `--action=dump-llvm-dialect`:
     Lower source to MLIR's LLVM dialect (i.e., the LLVM dialect, not
     LLVM IR)

  `--action=dump-llvm-ir`:
     Lower source to plain LLVM IR (i.e., not the LLVM dialect, but
     actual LLVM IR)

  `--action=dump-optimized-llvm-ir`:
     Lower source to plain LLVM IR (i.e., not the LLVM dialect, but
     actual LLVM IR), pass the result through the LLVM optimizer and
     print the result.

  `--action=dump-jit-invoke`:
     Execute the full lowering pipeline to optimized LLVM IR, JIT
     compile the result, invoke the function specified in
     `--jit-funcname` with the parameters from `--jit-args` and print
     the functions return value.
2021-09-28 11:35:58 +02:00
Andi Drebes
ddebedd1d6 refactor(compiler): Make function getV0Parameter return a pointer to a constant
The function `getV0Parameter()` returns a pointer to a static array,
which is not intended to be mutable. Reflect this in the return type
of the function.
2021-09-28 11:35:58 +02:00
Andi Drebes
6a76177a47 refactor(compiler): Move JIT functionality to separate source file 2021-09-28 11:35:58 +02:00
Andi Drebes
b9e2690823 refactor(compiler): Replace LOG_{VERBOSE,ERROR} macros with C++-style streams
Replace the macros `LOG_VERBOSE` and `LOG_ERROR` with C++-style
streams retrieved through `log_verbose()` and `log_error()`. This
aligns with the `MLIR` infrastructure and avoids pollution of the
global namespace through a common header file in subsequent
refactoring commits splitting the functionality of `src/main.cpp` into
multiple files.
2021-09-28 11:35:58 +02:00
Quentin Bourgerie
3a254bcb87 fix(compiler): Integrate the security estimator to compute variances 2021-09-20 13:46:08 +02:00
Quentin Bourgerie
8cc0af1220 fix(compiler): Add a pass to unparametrize LowLFHE ciphertext to remove unrelized_convesrion_cast for linalg bufferization 2021-09-09 20:35:28 +02:00
youben11
746d991af6 refactor: ins forward decl w generic ty @pass-init
Insert forward declarations with generic types at pass initialization.
More docs for all the pass for lowering LUT
2021-09-09 20:35:28 +02:00
youben11
272a725e9a feat(lower_LUT): add precision attribute to encode LUT at runtime 2021-09-09 20:35:28 +02:00
youben11
1e07733257 fix(lower-LUT): keep output size of KS during lowering
output size of keyswiting wasn't set properly. As this information must
come from the selected parameters, it should goes down from the MidLFHE
to the appropriate call to ciphertext allocation
2021-09-09 20:35:28 +02:00
youben11
c6b1480cc6 feat: generate runtime context at Argument creation 2021-09-09 20:35:28 +02:00
youben11
d1332dfd9a fix(compiler): polynomialSize from logPolynomialSize
The polynomialSize is currently holding its log2 instead of the actual
value. This should be fixed later, but in the meantime, we need to
compute it from log2
2021-09-09 20:35:28 +02:00
youben11
de81ac3f3e feat: Runtime library 2021-09-09 20:35:28 +02:00
youben11
6e2ac3af4e feat: parameterize KS operation 2021-09-09 20:35:28 +02:00
youben11
14f171bef9 feat: parameterize bst operation
This is needed to have the right parameters when calling concrete
2021-09-09 20:35:28 +02:00
youben11
3b5ae0657d feat: MidToLowLFHE lowering of apply_lut 2021-09-09 20:35:28 +02:00
youben11
b6c3eceadd refactor: remove keys from BS and KS ops in LowLFHE 2021-09-09 20:35:28 +02:00
Quentin Bourgerie
d2a3214bba clean(compiler): Return nullptr when conversion fails (should not happens but more safe in release mode) and remove dead code 2021-09-08 11:44:51 +02:00
Quentin Bourgerie
d03adbd7dc enhance(compiler): Add options for verbose passes 2021-09-08 11:44:51 +02:00
Quentin Bourgerie
1077c9167c enhance(compiler): Full lowering of hlfhe.zero, make dot_eint_int fully lowerable 2021-09-08 11:44:51 +02:00
Quentin Bourgerie
15fd194075 fix(compiler): Since the patterns could be call in any order take care of already lowered types in mid to low conversion 2021-09-08 11:44:51 +02:00
Quentin Bourgerie
af0789f128 enhance(compiler/runtime): Add runtime tools to handle tensor inputs and outputs 2021-09-06 10:26:40 +02:00
Quentin Bourgerie
dba76a1e1b enhance(compiler): Add tensor ops type rewriting on high level pipepline 2021-09-06 10:26:40 +02:00
Quentin Bourgerie
ce776c0eba fix(compiler/lowlfhe): lwe_ciphertext as memref element type 2021-09-06 10:26:40 +02:00
Quentin Bourgerie
19704b4b13 fix(compiler/lowlfhe): Use the lwe ciphertext parameters to allocate instead of global fhe context 2021-08-24 16:29:04 +02:00
Quentin Bourgerie
ee9acf08e8 enhance(compiler/lowlfhe): Add p and size to lwe_ciphertext 2021-08-24 16:29:04 +02:00
Quentin Bourgerie
67f0fc0f45 enhance(compiler): Introduce MidLFHE dag parametrization 2021-08-24 16:21:31 +02:00
Quentin Bourgerie
8057ee7553 refactor(compiler): Prepare the MidLFHE parameters injection 2021-08-24 16:21:31 +02:00
youben11
f948db1228 feat(python): CompilerEngine to compile and run 2021-08-18 17:38:46 +02:00
Quentin Bourgerie
fa62e1f0e5 refactor(compiler): Move memref HLFHE and MidLFHE operators to tensor 2021-08-18 11:15:30 +02:00
Quentin Bourgerie
7372cd3d0a fix(compiler/hlfhe): More verification on dot_eint_int 2021-08-17 16:53:32 +02:00
Andi Drebes
8b9c9f2da1 refactor(compiler): HLFHE.dot_eint_int: Switch from reference to value semantics
This changes the semantics of `HLFHE.dot_eint_int` from memref-based
reference semantics to tensor-based value semantics. The former:

  "HLFHE.dot_eint_int"(%arg0, %arg1, %arg2) :
     (memref<Nx!HLFHE.eint<0>>, memref<Nxi32>, memref<!HLFHE.eint<0>>) -> ()

becomes:

  "HLFHE.dot_eint_int"(%arg0, %arg1) :
     (tensor<Nx!HLFHE.eint<0>>, tensor<Nxi32>) -> !HLFHE.eint<0>

As a side effect, data-flow analyses become much easier. With the
previous memref type of the plaintext argument it is difficult to
check whether the plaintext values are statically defined constants or
originate from a memory region changed at execution time (e.g., for
analyses evaluating the impact on noise). Changing the plaintext type
from `memref` to `vector` makes such analyses significantly easier.
2021-08-17 16:53:32 +02:00
Andi Drebes
cb580f16d2 feat(compiler): Add operation HLFHE.zero generating an encrypted zero 2021-08-17 16:53:32 +02:00
Quentin Bourgerie
03297fd50d fix(compiler/lowlfhe): for the v0 give the lweSize of ciphertext as a global parameter of the lowering pass to concrete api call (#62) 2021-08-16 18:54:56 +02:00