mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-09 03:55:04 -05:00
feat: plug the compiler pipeline with the optimizer for 16 bits eint
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user