feat: plug the compiler pipeline with the optimizer for 16 bits eint

This commit is contained in:
Quentin Bourgerie
2022-08-05 09:52:40 +02:00
parent f3933aeddc
commit 5492ed01eb
11 changed files with 56 additions and 40 deletions

View File

@@ -23,7 +23,6 @@ struct V0FHEConstraint {
struct PackingKeySwitchParameter {
size_t inputLweDimension;
size_t inputLweCount;
size_t outputPolynomialSize;
size_t level;
size_t baseLog;
@@ -55,7 +54,7 @@ struct V0Parameter {
llvm::Optional<LargeIntegerParameter> largeInteger;
V0Parameter() = delete;
V0Parameter() {}
V0Parameter(size_t glweDimension, size_t logPolynomialSize, size_t nSmall,
size_t brLevel, size_t brLogBase, size_t ksLevel,

View File

@@ -115,7 +115,6 @@ def BConcrete_WopPBSCRTLweBufferOp : BConcrete_Op<"wop_pbs_crt_lwe_buffer"> {
I32Attr : $keyswitchBaseLog,
// Packing keyswitch key parameters
I32Attr : $packingKeySwitchInputLweDimension,
I32Attr : $packingKeySwitchinputLweCount,
I32Attr : $packingKeySwitchoutputPolynomialSize,
I32Attr : $packingKeySwitchLevel,
I32Attr : $packingKeySwitchBaseLog,

View File

@@ -97,7 +97,6 @@ def Concrete_WopPBSLweOp : Concrete_Op<"wop_pbs_lwe"> {
I32Attr : $keyswitchBaseLog,
// Packing keyswitch key parameters
I32Attr : $packingKeySwitchInputLweDimension,
I32Attr : $packingKeySwitchinputLweCount,
I32Attr : $packingKeySwitchoutputPolynomialSize,
I32Attr : $packingKeySwitchLevel,
I32Attr : $packingKeySwitchBaseLog,

View File

@@ -129,7 +129,6 @@ def TFHE_WopPBSGLWEOp : TFHE_Op<"wop_pbs_glwe"> {
I32Attr : $keyswitchBaseLog,
// Packing keyswitch key parameters
I32Attr : $packingKeySwitchInputLweDimension,
I32Attr : $packingKeySwitchinputLweCount,
I32Attr : $packingKeySwitchoutputPolynomialSize,
I32Attr : $packingKeySwitchLevel,
I32Attr : $packingKeySwitchBaseLog,

View File

@@ -42,7 +42,7 @@ struct Description {
} // namespace optimizer
llvm::Optional<V0Parameter> getParameter(optimizer::Description &descr,
llvm::Expected<V0Parameter> getParameter(optimizer::Description &descr,
optimizer::Config optimizerConfig);
} // namespace concretelang
} // namespace mlir

View File

@@ -147,7 +147,7 @@ struct ApplyLookupTableEintOpToWopPBSPattern
// (!TFHE.glwe<{_,_,_}{2}>)
auto wopPBS = rewriter.replaceOpWithNewOp<TFHE::WopPBSGLWEOp>(
lutOp, resultTy, lutOp.a(), lutOp.lut(), -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1);
-1, -1);
mlir::concretelang::convertOperandAndResultTypes(
rewriter, wopPBS, [&](mlir::MLIRContext *, mlir::Type t) {
return converter.convertType(t);

View File

@@ -181,7 +181,6 @@ struct WopPBSGLWEOpPattern : public mlir::OpRewritePattern<TFHE::WopPBSGLWEOp> {
// Packing keyswitch key parameters
cryptoParameters.largeInteger->wopPBS.packingKeySwitch
.inputLweDimension,
cryptoParameters.largeInteger->wopPBS.packingKeySwitch.inputLweCount,
cryptoParameters.largeInteger->wopPBS.packingKeySwitch
.outputPolynomialSize,
cryptoParameters.largeInteger->wopPBS.packingKeySwitch.level,

View File

@@ -129,7 +129,6 @@ struct WopPBSGLWEOpPattern : public mlir::OpRewritePattern<TFHE::WopPBSGLWEOp> {
wopOp.keyswitchLevel(), wopOp.keyswitchBaseLog(),
// Packing keyswitch key parameters
wopOp.packingKeySwitchInputLweDimension(),
wopOp.packingKeySwitchinputLweCount(),
wopOp.packingKeySwitchoutputPolynomialSize(),
wopOp.packingKeySwitchLevel(), wopOp.packingKeySwitchBaseLog(),
// Circuit bootstrap parameters

View File

@@ -171,11 +171,16 @@ CompilerEngine::getConcreteOptimizerDescription(CompilationResult &res) {
llvm::Error CompilerEngine::determineFHEParameters(CompilationResult &res) {
if (compilerOptions.v0Parameter.hasValue()) {
// parameters come from the compiler options
V0Parameter v0Params = compilerOptions.v0Parameter.value();
auto v0Params = compilerOptions.v0Parameter.value();
if (compilerOptions.largeIntegerParameter.hasValue()) {
v0Params.largeInteger = compilerOptions.largeIntegerParameter;
}
res.fheContext.emplace(mlir::concretelang::V0FHEContext{{0, 0}, v0Params});
V0FHEConstraint constraint;
if (compilerOptions.v0FHEConstraints.hasValue()) {
constraint = compilerOptions.v0FHEConstraints.value();
}
res.fheContext.emplace(
mlir::concretelang::V0FHEContext{constraint, v0Params});
return llvm::Error::success();
}
// compute parameters
@@ -187,16 +192,13 @@ llvm::Error CompilerEngine::determineFHEParameters(CompilationResult &res) {
if (!descr.get().hasValue()) {
return llvm::Error::success();
}
auto optV0Params =
auto v0Params =
getParameter(descr.get().value(), compilerOptions.optimizerConfig);
if (!optV0Params) {
return StreamStringError()
<< "Could not determine V0 parameters for 2-norm of "
<< (*descr)->constraint.norm2 << " and p of "
<< (*descr)->constraint.p;
if (auto err = v0Params.takeError()) {
return err;
}
res.fheContext.emplace(mlir::concretelang::V0FHEContext{
descr.get().value().constraint, optV0Params.getValue()});
descr.get().value().constraint, v0Params.get()});
}
return llvm::Error::success();

View File

@@ -16,8 +16,9 @@
#include "llvm/Support/raw_ostream.h"
#include "concrete-optimizer.hpp"
#include "concretelang/Support/Error.h"
#include "concretelang/Support/V0Parameters.h"
#include <concretelang/Support/logging.h>
#include "concretelang/Support/logging.h"
namespace mlir {
namespace concretelang {
@@ -75,7 +76,7 @@ static void display(V0FHEConstraint constraint,
o() << "---\n";
}
llvm::Optional<V0Parameter> getParameter(optimizer::Description &descr,
llvm::Expected<V0Parameter> getParameter(optimizer::Description &descr,
optimizer::Config config) {
namespace chrono = std::chrono;
auto start = chrono::high_resolution_clock::now();
@@ -94,24 +95,45 @@ llvm::Optional<V0Parameter> getParameter(optimizer::Description &descr,
if (sol.p_error == 1.0) {
// The optimizer return a p_error = 1 if there is no solution
return llvm::None;
return StreamStringError()
<< "Could not determine V0 parameters for 2-norm of "
<< descr.constraint.norm2 << " and p of " << descr.constraint.p;
}
V0Parameter params;
params.glweDimension = sol.glwe_dimension;
params.logPolynomialSize = (size_t)std::log2l(sol.glwe_polynomial_size);
params.nSmall = sol.internal_ks_output_lwe_dimension;
params.brLevel = sol.br_decomposition_level_count;
params.brLogBase = sol.br_decomposition_base_log;
params.ksLevel = sol.ks_decomposition_level_count;
params.ksLogBase = sol.ks_decomposition_base_log;
if (sol.use_wop_pbs) {
llvm::errs()
<< "WARNING: a woppbs solution exists but woppbs is not available\n";
return llvm::None;
if (sol.crt_decomposition.empty()) {
// TODO: FIXME
llvm::errs() << "FIXME: optimizer didn't returns the crt_decomposition\n";
sol.crt_decomposition = {7, 8, 9, 11, 13};
}
LargeIntegerParameter lParams;
for (auto m : sol.crt_decomposition) {
lParams.crtDecomposition.push_back(m);
}
lParams.wopPBS.circuitBootstrap.baseLog = sol.cb_decomposition_base_log;
lParams.wopPBS.circuitBootstrap.level = sol.cb_decomposition_level_count;
// FIXME: For now the packing keyswitch parameter are the same than the
// blind rotate one. But that should be done on the optimizer size and
// moreover this assumption could change.
lParams.wopPBS.packingKeySwitch.inputLweDimension = sol.input_lwe_dimension;
lParams.wopPBS.packingKeySwitch.outputPolynomialSize =
sol.glwe_polynomial_size;
lParams.wopPBS.packingKeySwitch.level = sol.br_decomposition_level_count;
lParams.wopPBS.packingKeySwitch.baseLog = sol.br_decomposition_base_log;
params.largeInteger = lParams;
}
return mlir::concretelang::V0Parameter{
sol.glwe_dimension,
(size_t)std::log2l(sol.glwe_polynomial_size),
sol.internal_ks_output_lwe_dimension,
sol.br_decomposition_level_count,
sol.br_decomposition_base_log,
sol.ks_decomposition_level_count,
sol.ks_decomposition_base_log,
};
return params;
}
} // namespace concretelang

View File

@@ -230,8 +230,8 @@ llvm::cl::list<int64_t> largeIntegerPackingKeyswitch(
llvm::cl::desc(
"Use the large integer to lower FHE.eint with the given parameters for "
"packing keyswitch, must be used with the other large-integers options "
"(experimental) [inputLweDimension, inputLweCount, "
"outputPolynomialSize, level, baseLog]"),
"(experimental) [inputLweDimension, outputPolynomialSize, level, "
"baseLog]"),
llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated);
llvm::cl::list<int64_t> largeIntegerCircuitBootstrap(
@@ -330,14 +330,12 @@ cmdlineCompilationOptions() {
cmdline::largeIntegerCRTDecomposition;
options.largeIntegerParameter->wopPBS.packingKeySwitch.inputLweDimension =
cmdline::largeIntegerPackingKeyswitch[0];
options.largeIntegerParameter->wopPBS.packingKeySwitch.inputLweCount =
cmdline::largeIntegerPackingKeyswitch[1];
options.largeIntegerParameter->wopPBS.packingKeySwitch
.outputPolynomialSize = cmdline::largeIntegerPackingKeyswitch[2];
.outputPolynomialSize = cmdline::largeIntegerPackingKeyswitch[1];
options.largeIntegerParameter->wopPBS.packingKeySwitch.level =
cmdline::largeIntegerPackingKeyswitch[3];
cmdline::largeIntegerPackingKeyswitch[2];
options.largeIntegerParameter->wopPBS.packingKeySwitch.baseLog =
cmdline::largeIntegerPackingKeyswitch[4];
cmdline::largeIntegerPackingKeyswitch[3];
options.largeIntegerParameter->wopPBS.circuitBootstrap.level =
cmdline::largeIntegerCircuitBootstrap[0];
options.largeIntegerParameter->wopPBS.circuitBootstrap.baseLog =