Draft for ilog2 GPu tests

This commit is contained in:
Agnes Leroy
2024-07-29 18:13:52 +02:00
committed by Guillermo Oyarzun
parent 2ef7830468
commit 9fccada524
6 changed files with 211 additions and 56 deletions

View File

@@ -2,6 +2,7 @@ pub(crate) mod test_add;
pub(crate) mod test_bitwise_op;
pub(crate) mod test_cmux;
pub(crate) mod test_comparison;
pub(crate) mod test_ilog2;
pub(crate) mod test_mul;
pub(crate) mod test_neg;
pub(crate) mod test_rotate;

View File

@@ -0,0 +1,64 @@
//use crate::integer::gpu::server_key::radix::tests_unsigned::{
// create_gpu_parametrized_test, GpuFunctionExecutor,
//};
//use crate::integer::gpu::CudaServerKey;
//use crate::integer::server_key::radix_parallel::tests_signed::test_ilog2::{default_checked_ilog2_test, default_ilog2_test, default_leading_ones_test, default_leading_zeros_test, default_trailing_ones_test, default_trailing_zeros_test};
//use crate::integer::server_key::radix_parallel::tests_signed::test_mul::{
// signed_default_mul_test, signed_unchecked_mul_test,
//};
//use crate::shortint::parameters::*;
//
//create_gpu_parametrized_test!(integer_signed_default_trailing_zeros);
//create_gpu_parametrized_test!(integer_signed_default_trailing_ones);
//create_gpu_parametrized_test!(integer_signed_default_leading_zeros);
//create_gpu_parametrized_test!(integer_signed_default_leading_ones);
//create_gpu_parametrized_test!(integer_signed_default_ilog2);
//create_gpu_parametrized_test!(integer_signed_default_checked_ilog2);
//
//fn integer_signed_default_trailing_zeros<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::trailing_zeros);
// default_trailing_zeros_test(param, executor);
//}
//
//fn integer_signed_default_trailing_ones<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::trailing_ones);
// default_trailing_ones_test(param, executor);
//}
//
//fn integer_signed_default_leading_zeros<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::leading_zeros);
// default_leading_zeros_test(param, executor);
//}
//
//fn integer_signed_default_leading_ones<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::leading_ones);
// default_leading_ones_test(param, executor);
//}
//
//fn integer_signed_default_ilog2<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::ilog2);
// default_ilog2_test(param, executor);
//}
//
//fn integer_signed_default_checked_ilog2<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::checked_ilog2);
// default_checked_ilog2_test(param, executor);
//}

View File

@@ -3,6 +3,7 @@ pub(crate) mod test_bitwise_op;
pub(crate) mod test_cmux;
pub(crate) mod test_comparison;
pub(crate) mod test_div_mod;
pub(crate) mod test_ilog2;
pub(crate) mod test_mul;
pub(crate) mod test_neg;
pub(crate) mod test_rotate;

View File

@@ -0,0 +1,65 @@
//use crate::integer::gpu::server_key::radix::tests_unsigned::{
// create_gpu_parametrized_test, GpuFunctionExecutor,
//};
//use crate::integer::gpu::CudaServerKey;
//use crate::integer::server_key::radix_parallel::tests_cases_unsigned::{
// default_mul_test, unchecked_mul_test,
//};
//use crate::integer::server_key::radix_parallel::tests_unsigned::test_ilog2::{default_checked_ilog2_test, default_ilog2_test, default_leading_ones_test, default_leading_zeros_test, default_trailing_ones_test, default_trailing_zeros_test};
//use crate::integer::ServerKey;
//use crate::shortint::parameters::*;
//
//create_gpu_parametrized_test!(integer_default_trailing_zeros);
//create_gpu_parametrized_test!(integer_default_trailing_ones);
//create_gpu_parametrized_test!(integer_default_leading_zeros);
//create_gpu_parametrized_test!(integer_default_leading_ones);
//create_gpu_parametrized_test!(integer_default_ilog2);
//create_gpu_parametrized_test!(integer_default_checked_ilog2);
//
//fn integer_default_trailing_zeros<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::trailing_zeros);
// default_trailing_zeros_test(param, executor);
//}
//
//fn integer_default_trailing_ones<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::trailing_ones);
// default_trailing_ones_test(param, executor);
//}
//
//fn integer_default_leading_zeros<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::leading_zeros);
// default_leading_zeros_test(param, executor);
//}
//
//fn integer_default_leading_ones<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::leading_ones);
// default_leading_ones_test(param, executor);
//}
//
//fn integer_default_ilog2<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::ilog2);
// default_ilog2_test(param, executor);
//}
//
//fn integer_default_checked_ilog2<P>(param: P)
// where
// P: Into<PBSParameters>,
//{
// let executor = GpuFunctionExecutor::new(&CudaServerKey::checked_ilog2);
// default_checked_ilog2_test(param, executor);
//}

View File

@@ -25,7 +25,7 @@ use crate::integer::server_key::radix_parallel::tests_unsigned::{
};
use crate::integer::tests::create_parametrized_test;
use crate::integer::{
BooleanBlock, IntegerKeyKind, RadixClientKey, ServerKey, SignedRadixCiphertext,
BooleanBlock, IntegerKeyKind, RadixCiphertext, RadixClientKey, ServerKey, SignedRadixCiphertext,
};
#[cfg(tarpaulin)]
use crate::shortint::parameters::coverage_parameters::*;
@@ -67,6 +67,34 @@ where
(self.func)(sks, input)
}
}
impl<'a, F> FunctionExecutor<&'a SignedRadixCiphertext, (RadixCiphertext, BooleanBlock)>
for CpuFunctionExecutor<F>
where
F: Fn(&ServerKey, &SignedRadixCiphertext) -> (RadixCiphertext, BooleanBlock),
{
fn setup(&mut self, _cks: &RadixClientKey, sks: Arc<ServerKey>) {
self.sks = Some(sks);
}
fn execute(&mut self, input: &'a SignedRadixCiphertext) -> (RadixCiphertext, BooleanBlock) {
let sks = self.sks.as_ref().expect("setup was not properly called");
(self.func)(sks, input)
}
}
impl<'a, F> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext> for CpuFunctionExecutor<F>
where
F: Fn(&ServerKey, &SignedRadixCiphertext) -> RadixCiphertext,
{
fn setup(&mut self, _cks: &RadixClientKey, sks: Arc<ServerKey>) {
self.sks = Some(sks);
}
fn execute(&mut self, input: &'a SignedRadixCiphertext) -> RadixCiphertext {
let sks = self.sks.as_ref().expect("setup was not properly called");
(self.func)(sks, input)
}
}
impl<'a, F> FunctionExecutor<&'a mut SignedRadixCiphertext, ()> for CpuFunctionExecutor<F>
where
F: Fn(&ServerKey, &'a mut SignedRadixCiphertext),

View File

@@ -2,12 +2,10 @@ use crate::integer::keycache::KEY_CACHE;
use crate::integer::server_key::radix_parallel::ilog2::{BitValue, Direction};
use crate::integer::server_key::radix_parallel::tests_cases_unsigned::FunctionExecutor;
use crate::integer::server_key::radix_parallel::tests_signed::{
create_iterator_of_signed_random_pairs, random_non_zero_value, signed_add_under_modulus,
signed_overflowing_add_under_modulus, NB_CTXT,
random_non_zero_value, signed_add_under_modulus, NB_CTXT,
};
use crate::integer::server_key::radix_parallel::tests_unsigned::{
nb_tests_for_params, nb_tests_smaller_for_params, nb_unchecked_tests_for_params,
CpuFunctionExecutor,
nb_tests_smaller_for_params, CpuFunctionExecutor,
};
use crate::integer::tests::create_parametrized_test;
use crate::integer::{
@@ -40,52 +38,58 @@ fn integer_signed_default_trailing_zeros<P>(param: P)
where
P: Into<PBSParameters>,
{
default_trailing_zeros_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::trailing_zeros_parallelized);
default_trailing_zeros_test(param, executor);
}
fn integer_signed_default_trailing_ones<P>(param: P)
where
P: Into<PBSParameters>,
{
default_trailing_ones_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::trailing_ones_parallelized);
default_trailing_ones_test(param, executor);
}
fn integer_signed_default_leading_zeros<P>(param: P)
where
P: Into<PBSParameters>,
{
default_leading_zeros_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::leading_zeros_parallelized);
default_leading_zeros_test(param, executor);
}
fn integer_signed_default_leading_ones<P>(param: P)
where
P: Into<PBSParameters>,
{
default_leading_ones_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::leading_ones_parallelized);
default_leading_ones_test(param, executor);
}
fn integer_signed_default_ilog2<P>(param: P)
where
P: Into<PBSParameters>,
{
default_ilog2_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::ilog2_parallelized);
default_ilog2_test(param, executor);
}
fn integer_signed_default_checked_ilog2<P>(param: P)
where
P: Into<PBSParameters>,
{
default_checked_ilog2_test(param);
let executor = CpuFunctionExecutor::new(&ServerKey::checked_ilog2_parallelized);
default_checked_ilog2_test(param, executor);
}
pub(crate) fn default_test_count_consecutive_bits<P, F>(
pub(crate) fn signed_default_count_consecutive_bits_test<P, T>(
direction: Direction,
bit_value: BitValue,
param: P,
sks_method: F,
mut executor: T,
) where
P: Into<PBSParameters>,
F: for<'a> Fn(&'a ServerKey, &'a SignedRadixCiphertext) -> RadixCiphertext,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
let param = param.into();
let nb_tests_smaller = nb_tests_smaller_for_params(param);
@@ -135,8 +139,8 @@ pub(crate) fn default_test_count_consecutive_bits<P, F>(
for clear in input_values {
let ctxt = cks.encrypt_signed(clear);
let ct_res = sks_method(&sks, &ctxt);
let tmp = sks_method(&sks, &ctxt);
let ct_res = executor.execute(&ctxt);
let tmp = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
assert_eq!(ct_res, tmp);
@@ -159,7 +163,7 @@ pub(crate) fn default_test_count_consecutive_bits<P, F>(
let d0: i64 = cks.decrypt_signed(&ctxt);
assert_eq!(d0, clear, "Failed sanity decryption check");
let ct_res = sks_method(&sks, &ctxt);
let ct_res = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let expected_result = compute_expected_clear(clear);
@@ -180,7 +184,7 @@ pub(crate) fn default_test_count_consecutive_bits<P, F>(
for clear in input_values {
let ctxt = sks.create_trivial_radix(clear, NB_CTXT);
let ct_res = sks_method(&sks, &ctxt);
let ct_res = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let decrypted_result: u32 = cks.decrypt(&ct_res);
@@ -193,57 +197,47 @@ pub(crate) fn default_test_count_consecutive_bits<P, F>(
}
}
pub(crate) fn default_trailing_zeros_test<P>(param: P)
pub(crate) fn default_trailing_zeros_test<P, T>(param: P, executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
default_test_count_consecutive_bits(
signed_default_count_consecutive_bits_test(
Direction::Trailing,
BitValue::Zero,
param,
ServerKey::trailing_zeros_parallelized,
executor,
);
}
pub(crate) fn default_trailing_ones_test<P>(param: P)
pub(crate) fn default_trailing_ones_test<P, T>(param: P, executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
default_test_count_consecutive_bits(
Direction::Trailing,
BitValue::One,
param,
ServerKey::trailing_ones_parallelized,
);
signed_default_count_consecutive_bits_test(Direction::Trailing, BitValue::One, param, executor);
}
pub(crate) fn default_leading_zeros_test<P>(param: P)
pub(crate) fn default_leading_zeros_test<P, T>(param: P, executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
default_test_count_consecutive_bits(
Direction::Leading,
BitValue::Zero,
param,
ServerKey::leading_zeros_parallelized,
);
signed_default_count_consecutive_bits_test(Direction::Leading, BitValue::Zero, param, executor);
}
pub(crate) fn default_leading_ones_test<P>(param: P)
pub(crate) fn default_leading_ones_test<P, T>(param: P, executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
default_test_count_consecutive_bits(
Direction::Leading,
BitValue::One,
param,
ServerKey::leading_ones_parallelized,
);
signed_default_count_consecutive_bits_test(Direction::Leading, BitValue::One, param, executor);
}
pub(crate) fn default_ilog2_test<P>(param: P)
pub(crate) fn default_ilog2_test<P, T>(param: P, mut executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, RadixCiphertext>,
{
let param = param.into();
let nb_tests_smaller = nb_tests_smaller_for_params(param);
@@ -251,6 +245,8 @@ where
let cks = RadixClientKey::from((cks, NB_CTXT));
sks.set_deterministic_pbs_execution(true);
let sks = Arc::new(sks);
executor.setup(&cks, sks.clone());
let mut rng = rand::thread_rng();
@@ -264,7 +260,7 @@ where
for clear in [0i64, rng.gen_range(-modulus..=-1i64)] {
let ctxt = cks.encrypt_signed(clear);
let ct_res = sks.ilog2_parallelized(&ctxt);
let ct_res = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let decrypted_result: u32 = cks.decrypt(&ct_res);
@@ -296,8 +292,8 @@ where
for clear in input_values {
let ctxt = cks.encrypt_signed(clear);
let ct_res = sks.ilog2_parallelized(&ctxt);
let tmp = sks.ilog2_parallelized(&ctxt);
let ct_res = executor.execute(&ctxt);
let tmp = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
assert_eq!(ct_res, tmp);
@@ -326,7 +322,7 @@ where
let d0: i64 = cks.decrypt_signed(&ctxt);
assert_eq!(d0, clear, "Failed sanity decryption check");
let ct_res = sks.ilog2_parallelized(&ctxt);
let ct_res = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let expected_result = clear.ilog2();
@@ -351,8 +347,8 @@ where
for clear in input_values {
let ctxt: SignedRadixCiphertext = sks.create_trivial_radix(clear, NB_CTXT);
let ct_res = sks.ilog2_parallelized(&ctxt);
let tmp = sks.ilog2_parallelized(&ctxt);
let ct_res = executor.execute(&ctxt);
let tmp = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
assert_eq!(ct_res, tmp);
@@ -370,7 +366,7 @@ where
pub(crate) fn default_checked_ilog2_test<P, T>(param: P, mut executor: T)
where
P: Into<PBSParameters>,
T: for<'a> FunctionExecutor<(&'a SignedRadixCiphertext), SignedRadixCiphertext>,
T: for<'a> FunctionExecutor<&'a SignedRadixCiphertext, (RadixCiphertext, BooleanBlock)>,
{
let param = param.into();
let nb_tests_smaller = nb_tests_smaller_for_params(param);
@@ -381,7 +377,7 @@ where
let mut rng = rand::thread_rng();
let sks = Arc::new(sks);
executor.setup(&cks, sks);
executor.setup(&cks, sks.clone());
// message_modulus^vec_length
let modulus = (cks.parameters().message_modulus().0.pow(NB_CTXT as u32) / 2) as i64;
@@ -393,7 +389,7 @@ where
for clear in [0i64, rng.gen_range(-modulus..=-1i64)] {
let ctxt = cks.encrypt_signed(clear);
let (ct_res, is_ok) = executor.execute((&ctxt));
let (ct_res, is_ok) = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let decrypted_result: u32 = cks.decrypt(&ct_res);
@@ -427,8 +423,8 @@ where
for clear in input_values {
let ctxt = cks.encrypt_signed(clear);
let (ct_res, is_ok) = sks.checked_ilog2_parallelized(&ctxt);
let (tmp, tmp_is_ok) = sks.checked_ilog2_parallelized(&ctxt);
let (ct_res, is_ok) = executor.execute(&ctxt);
let (tmp, tmp_is_ok) = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
assert_eq!(ct_res, tmp);
assert_eq!(is_ok, tmp_is_ok);
@@ -460,7 +456,7 @@ where
let d0: i64 = cks.decrypt_signed(&ctxt);
assert_eq!(d0, clear, "Failed sanity decryption check");
let (ct_res, is_ok) = sks.checked_ilog2_parallelized(&ctxt);
let (ct_res, is_ok) = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
assert_eq!(is_ok.as_ref().degree.get(), 1);
@@ -488,7 +484,7 @@ where
for clear in input_values {
let ctxt: SignedRadixCiphertext = sks.create_trivial_radix(clear, NB_CTXT);
let (ct_res, is_ok) = sks.checked_ilog2_parallelized(&ctxt);
let (ct_res, is_ok) = executor.execute(&ctxt);
assert!(ct_res.block_carries_are_empty());
let decrypted_result: u32 = cks.decrypt(&ct_res);