chore(csprng)!: remove generator_x86_64_aesni feature

BREAKING_CHANGE:
- The `generator_x86_64_aesni` feature is no longer supported for tfhe-csprng
This commit is contained in:
Nicolas Sarlin
2024-12-09 14:58:07 +01:00
committed by Nicolas Sarlin
parent 3de23d14a2
commit 0f2451e3b7
11 changed files with 39 additions and 49 deletions

View File

@@ -25,24 +25,19 @@ clap = "=4.4.4"
[features]
parallel = ["rayon"]
generator_x86_64_aesni = []
generator_fallback = []
generator_aarch64_aes = []
x86_64 = [
"parallel",
"generator_x86_64_aesni",
"generator_fallback",
]
x86_64 = ["parallel", "generator_fallback"]
x86_64-unix = ["x86_64"]
aarch64 = ["parallel", "generator_aarch64_aes", "generator_fallback"]
aarch64-unix = ["aarch64"]
software_prng = []
[[bench]]
name = "benchmark"
path = "benches/benchmark.rs"
harness = false
required-features = ["generator_x86_64_aesni"]
[[example]]
name = "generate"

View File

@@ -14,7 +14,7 @@ The crate also makes two seeders available, one needing the x86_64 instruction `
To execute the benchmarks on an x86_64 platform:
```shell
RUSTFLAGS="-Ctarget-cpu=native" cargo bench --features=generator_x86_64_aesni
RUSTFLAGS="-Ctarget-cpu=native" cargo bench
```
## License

View File

@@ -1,7 +1,9 @@
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use tfhe_csprng::generators::{
AesniRandomGenerator, BytesPerChild, ChildrenCount, RandomGenerator,
};
#[cfg(all(target_arch = "x86_64", target_feature = "aes"))]
use tfhe_csprng::generators::AesniRandomGenerator as ActivatedRandomGenerator;
#[cfg(not(all(target_arch = "x86_64", target_feature = "aes")))]
use tfhe_csprng::generators::SoftwareRandomGenerator as ActivatedRandomGenerator;
use tfhe_csprng::generators::{BytesPerChild, ChildrenCount, RandomGenerator};
use tfhe_csprng::seeders::{RdseedSeeder, Seeder};
// The number of bytes to generate during one benchmark iteration.
@@ -9,7 +11,7 @@ const N_GEN: usize = 1_000_000;
fn parent_generate(c: &mut Criterion) {
let mut seeder = RdseedSeeder::new();
let mut generator = AesniRandomGenerator::new(seeder.seed());
let mut generator = ActivatedRandomGenerator::new(seeder.seed());
c.bench_function("parent_generate", |b| {
b.iter(|| {
(0..N_GEN).for_each(|_| {
@@ -21,7 +23,7 @@ fn parent_generate(c: &mut Criterion) {
fn child_generate(c: &mut Criterion) {
let mut seeder = RdseedSeeder::new();
let mut generator = AesniRandomGenerator::new(seeder.seed());
let mut generator = ActivatedRandomGenerator::new(seeder.seed());
let mut generator = generator
.try_fork(ChildrenCount(1), BytesPerChild(N_GEN * 10_000))
.unwrap()
@@ -38,7 +40,7 @@ fn child_generate(c: &mut Criterion) {
fn fork(c: &mut Criterion) {
let mut seeder = RdseedSeeder::new();
let mut generator = AesniRandomGenerator::new(seeder.seed());
let mut generator = ActivatedRandomGenerator::new(seeder.seed());
c.bench_function("fork", |b| {
b.iter(|| {
black_box(

View File

@@ -53,18 +53,11 @@ impl FeatureRequirement {
// const vecs are not yet a thing so use a fixed size array (update the array size when adding
// requirements)
static FEATURE_REQUIREMENTS: [FeatureRequirement; 2] = [
FeatureRequirement {
feature_name: "generator_x86_64_aesni",
feature_req_target_arch: Some("x86_64"),
feature_req_target_family: None,
},
FeatureRequirement {
feature_name: "generator_aarch64_aes",
feature_req_target_arch: Some("aarch64"),
feature_req_target_family: None,
},
];
static FEATURE_REQUIREMENTS: [FeatureRequirement; 1] = [FeatureRequirement {
feature_name: "generator_aarch64_aes",
feature_req_target_arch: Some("aarch64"),
feature_req_target_family: None,
}];
// For a "feature_name" feature_cfg!("feature_name") expands to
// ("feature_name", cfg!(feature = "feature_name"))
@@ -77,10 +70,7 @@ macro_rules! feature_cfg {
// Static HashMap would require an additional crate (phf or lazy static e.g.), so we just write a
// function that returns the HashMap we are interested in
fn get_feature_enabled_status() -> HashMap<&'static str, bool> {
HashMap::from([
feature_cfg!("generator_x86_64_aesni"),
feature_cfg!("generator_aarch64_aes"),
])
HashMap::from([feature_cfg!("generator_aarch64_aes")])
}
// See https://stackoverflow.com/a/43435335/18088947 for the inspiration of this code

View File

@@ -2,15 +2,22 @@
//! the program stdout. It can also generate a fixed number of bytes by passing a value along the
//! optional argument `--bytes_total`. For testing purpose.
use clap::{value_parser, Arg, Command};
#[cfg(feature = "generator_x86_64_aesni")]
#[cfg(all(
target_arch = "x86_64",
target_feature = "aes",
target_feature = "sse2"
))]
use tfhe_csprng::generators::AesniRandomGenerator as ActivatedRandomGenerator;
#[cfg(feature = "generator_aarch64_aes")]
use tfhe_csprng::generators::NeonAesRandomGenerator as ActivatedRandomGenerator;
use tfhe_csprng::generators::RandomGenerator;
#[cfg(all(
not(feature = "generator_x86_64_aesni"),
not(all(
target_arch = "x86_64",
target_feature = "aes",
target_feature = "sse2"
)),
not(feature = "generator_aarch64_aes"),
feature = "generator_fallback"
))]
use tfhe_csprng::generators::SoftwareRandomGenerator as ActivatedRandomGenerator;

View File

@@ -206,7 +206,6 @@ pub use index::*;
/// A module containing structures to manage table indices and buffer pointers together properly.
mod states;
pub use states::*;
/// A module containing an abstraction for aes block ciphers.
mod block_cipher;

View File

@@ -1,5 +1,5 @@
use crate::generators::aes_ctr::{
AesBlockCipher, AesCtrGenerator, ChildrenClosure, State, TableIndex,
states::State, AesBlockCipher, AesCtrGenerator, ChildrenClosure, TableIndex,
};
use crate::generators::{BytesPerChild, ChildrenCount, ForkError};

View File

@@ -20,7 +20,8 @@ impl AesBlockCipher for AesniBlockCipher {
if !(aes_detected && sse2_detected) {
panic!(
"The AesniBlockCipher requires both aes and sse2 x86 CPU features.\n\
aes feature available: {}\nsse2 feature available: {}\n.",
aes feature available: {}\nsse2 feature available: {}\n\
Please consider enabling the SoftwareRandomGenerator with the `software_prng` feature",
aes_detected, sse2_detected
)
}

View File

@@ -1,6 +1,6 @@
#[cfg(feature = "generator_x86_64_aesni")]
#[cfg(target_arch = "x86_64")]
mod aesni;
#[cfg(feature = "generator_x86_64_aesni")]
#[cfg(target_arch = "x86_64")]
pub use aesni::*;
#[cfg(feature = "generator_aarch64_aes")]
@@ -8,7 +8,7 @@ mod aarch64;
#[cfg(feature = "generator_aarch64_aes")]
pub use aarch64::*;
#[cfg(feature = "generator_fallback")]
#[cfg(feature = "software_prng")]
mod soft;
#[cfg(feature = "generator_fallback")]
#[cfg(feature = "software_prng")]
pub use soft::*;

View File

@@ -129,10 +129,6 @@ parallel-wasm-api = ["dep:wasm-bindgen-rayon"]
nightly-avx512 = ["tfhe-fft/nightly", "tfhe-ntt/nightly", "pulp/nightly"]
# Enable the x86_64 specific accelerated implementation of the random generator for the default
# backend
generator_x86_64_aesni = ["tfhe-csprng/generator_x86_64_aesni"]
# Enable the aarch64 specific accelerated implementation of the random generator for the default
# backend
generator_aarch64_aes = ["tfhe-csprng/generator_aarch64_aes"]
@@ -145,7 +141,7 @@ __long_run_tests = []
# good/working configuration for tfhe.
# For a target_arch that does not yet have such a feature, one can still enable features manually or
# create a feature for said target_arch to make its use simpler.
x86_64 = ["generator_x86_64_aesni"]
x86_64 = []
x86_64-unix = ["x86_64"]
aarch64 = ["generator_aarch64_aes"]

View File

@@ -1,19 +1,19 @@
#[cfg(feature = "generator_x86_64_aesni")]
#[cfg(all(target_arch = "x86_64", target_feature = "aes"))]
use tfhe_csprng::generators::AesniRandomGenerator;
#[cfg(feature = "generator_aarch64_aes")]
use tfhe_csprng::generators::NeonAesRandomGenerator;
#[cfg(all(
not(feature = "generator_x86_64_aesni"),
not(all(target_arch = "x86_64", target_feature = "aes")),
not(feature = "generator_aarch64_aes")
))]
use tfhe_csprng::generators::SoftwareRandomGenerator;
#[cfg(feature = "generator_x86_64_aesni")]
#[cfg(all(target_arch = "x86_64", target_feature = "aes"))]
pub type ActivatedRandomGenerator = AesniRandomGenerator;
#[cfg(feature = "generator_aarch64_aes")]
pub type ActivatedRandomGenerator = NeonAesRandomGenerator;
#[cfg(all(
not(feature = "generator_x86_64_aesni"),
not(all(target_arch = "x86_64", target_feature = "aes")),
not(feature = "generator_aarch64_aes")
))]
pub type ActivatedRandomGenerator = SoftwareRandomGenerator;