diff --git a/backends/concrete-cpu/implementation/include/concrete-cpu.h b/backends/concrete-cpu/implementation/include/concrete-cpu.h index a79acdc69..8d99db881 100644 --- a/backends/concrete-cpu/implementation/include/concrete-cpu.h +++ b/backends/concrete-cpu/implementation/include/concrete-cpu.h @@ -177,7 +177,8 @@ void concrete_cpu_decompress_seeded_lwe_bootstrap_key_u64(uint64_t *lwe_bsk, size_t output_glwe_dimension, size_t decomposition_level_count, size_t decomposition_base_log, - struct Uint128 compression_seed); + struct Uint128 compression_seed, + Parallelism parallelism); void concrete_cpu_decompress_seeded_lwe_ciphertext_u64(uint64_t *lwe_out, const uint64_t *seeded_lwe_in, @@ -190,7 +191,8 @@ void concrete_cpu_decompress_seeded_lwe_keyswitch_key_u64(uint64_t *lwe_ksk, size_t output_lwe_dimension, size_t decomposition_level_count, size_t decomposition_base_log, - struct Uint128 compression_seed); + struct Uint128 compression_seed, + Parallelism parallelism); void concrete_cpu_decrypt_glwe_ciphertext_u64(const uint64_t *glwe_sk, uint64_t *output, diff --git a/backends/concrete-cpu/implementation/src/c_api/bootstrap.rs b/backends/concrete-cpu/implementation/src/c_api/bootstrap.rs index 82026466d..717b391c1 100644 --- a/backends/concrete-cpu/implementation/src/c_api/bootstrap.rs +++ b/backends/concrete-cpu/implementation/src/c_api/bootstrap.rs @@ -179,6 +179,8 @@ pub unsafe extern "C" fn concrete_cpu_decompress_seeded_lwe_bootstrap_key_u64( decomposition_level_count: usize, decomposition_base_log: usize, compression_seed: Uint128, + // parallelism + parallelism: Parallelism, ) { nounwind(|| { let mut output_bsk = LweBootstrapKey::from_container( @@ -217,11 +219,20 @@ pub unsafe extern "C" fn concrete_cpu_decompress_seeded_lwe_bootstrap_key_u64( CompressionSeed { seed }, CiphertextModulus::new_native(), ); - - decompress_seeded_lwe_bootstrap_key::<_, _, _, SoftwareRandomGenerator>( - &mut output_bsk, - &input_bsk, - ) + match parallelism { + Parallelism::No => { + decompress_seeded_lwe_bootstrap_key::<_, _, _, SoftwareRandomGenerator>( + &mut output_bsk, + &input_bsk, + ) + } + Parallelism::Rayon => { + par_decompress_seeded_lwe_bootstrap_key::<_, _, _, SoftwareRandomGenerator>( + &mut output_bsk, + &input_bsk, + ) + } + } }); } diff --git a/backends/concrete-cpu/implementation/src/c_api/keyswitch.rs b/backends/concrete-cpu/implementation/src/c_api/keyswitch.rs index 6c9c9915f..abc5c5246 100644 --- a/backends/concrete-cpu/implementation/src/c_api/keyswitch.rs +++ b/backends/concrete-cpu/implementation/src/c_api/keyswitch.rs @@ -5,6 +5,7 @@ use tfhe::core_crypto::prelude::*; use super::csprng::new_dyn_seeder; use super::types::{EncCsprng, Uint128}; use super::utils::nounwind; +use crate::c_api::types::Parallelism; #[no_mangle] pub unsafe extern "C" fn concrete_cpu_init_lwe_keyswitch_key_u64( @@ -128,6 +129,8 @@ pub unsafe extern "C" fn concrete_cpu_decompress_seeded_lwe_keyswitch_key_u64( decomposition_level_count: usize, decomposition_base_log: usize, compression_seed: Uint128, + // parallelism + parallelism: Parallelism, ) { nounwind(|| { let mut output_ksk = LweKeyswitchKey::from_container( @@ -161,11 +164,20 @@ pub unsafe extern "C" fn concrete_cpu_decompress_seeded_lwe_keyswitch_key_u64( CompressionSeed { seed }, CiphertextModulus::new_native(), ); - - decompress_seeded_lwe_keyswitch_key::<_, _, _, SoftwareRandomGenerator>( - &mut output_ksk, - &input_ksk, - ) + match parallelism { + Parallelism::No => { + decompress_seeded_lwe_keyswitch_key::<_, _, _, SoftwareRandomGenerator>( + &mut output_ksk, + &input_ksk, + ) + } + Parallelism::Rayon => { + par_decompress_seeded_lwe_keyswitch_key::<_, _, _, SoftwareRandomGenerator>( + &mut output_ksk, + &input_ksk, + ) + } + } }); } diff --git a/compilers/concrete-compiler/compiler/lib/Common/Keys.cpp b/compilers/concrete-compiler/compiler/lib/Common/Keys.cpp index 64f04cb2e..e5adfeb83 100644 --- a/compilers/concrete-compiler/compiler/lib/Common/Keys.cpp +++ b/compilers/concrete-compiler/compiler/lib/Common/Keys.cpp @@ -233,7 +233,7 @@ void LweBootstrapKey::decompress() { concrete_cpu_decompress_seeded_lwe_bootstrap_key_u64( buffer->data(), seededBuffer->data() + 2, params.getInputLweDimension(), params.getPolynomialSize(), params.getGlweDimension(), - params.getLevelCount(), params.getBaseLog(), seed); + params.getLevelCount(), params.getBaseLog(), seed, Parallelism::Rayon); decompressed = true; return; } @@ -353,7 +353,7 @@ void LweKeyswitchKey::decompress() { concrete_cpu_decompress_seeded_lwe_keyswitch_key_u64( buffer->data(), seededBuffer->data() + 2, params.getInputLweDimension(), params.getOutputLweDimension(), params.getLevelCount(), - params.getBaseLog(), seed); + params.getBaseLog(), seed, Parallelism::Rayon); decompressed = true; return; }