Fix AVX2 and AVX-512 builds (#419)

Build was broken by 5758b8c.
This adds a regression test to CI so it doesn't happen again
This commit is contained in:
Michael Rosenberg 2022-10-28 13:10:44 -04:00 committed by GitHub
parent 3a94bf8a8e
commit 8fa201639a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 69 additions and 63 deletions

View file

@ -26,13 +26,19 @@ jobs:
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- run: cargo test --no-default-features --features "std u64_backend" - run: cargo test --no-default-features --features "std u64_backend"
test-simd: build-simd:
name: Test simd backend (nightly) name: Build simd backend (nightly)
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@nightly - uses: dtolnay/rust-toolchain@nightly
- run: cargo test --no-default-features --features "std simd_backend" # Build with AVX2 features, then with AVX512 features
- env:
RUSTFLAGS: "-C target_feature=+avx2"
run: cargo build --no-default-features --features "std simd_backend"
- env:
RUSTFLAGS: "-C target_feature=+avx512ifma"
run: cargo build --no-default-features --features "std simd_backend"
test-defaults-serde: test-defaults-serde:
name: Test default feature selection and serde name: Test default feature selection and serde

View file

@ -13,9 +13,9 @@
use packed_simd::u32x8; use packed_simd::u32x8;
use backend::vector::avx2::edwards::{CachedPoint, ExtendedPoint}; use crate::backend::vector::avx2::edwards::{CachedPoint, ExtendedPoint};
use backend::vector::avx2::field::FieldElement2625x4; use crate::backend::vector::avx2::field::FieldElement2625x4;
use window::NafLookupTable8; use crate::window::NafLookupTable8;
/// The identity element as an `ExtendedPoint`. /// The identity element as an `ExtendedPoint`.
pub(crate) static EXTENDEDPOINT_IDENTITY: ExtendedPoint = ExtendedPoint(FieldElement2625x4([ pub(crate) static EXTENDEDPOINT_IDENTITY: ExtendedPoint = ExtendedPoint(FieldElement2625x4([

View file

@ -41,10 +41,10 @@ use core::ops::{Add, Neg, Sub};
use subtle::Choice; use subtle::Choice;
use subtle::ConditionallySelectable; use subtle::ConditionallySelectable;
use edwards; use crate::edwards;
use window::{LookupTable, NafLookupTable5, NafLookupTable8}; use crate::window::{LookupTable, NafLookupTable5, NafLookupTable8};
use traits::Identity; use crate::traits::Identity;
use super::constants; use super::constants;
use super::field::{FieldElement2625x4, Lanes, Shuffle}; use super::field::{FieldElement2625x4, Lanes, Shuffle};
@ -330,7 +330,7 @@ mod test {
use super::*; use super::*;
fn serial_add(P: edwards::EdwardsPoint, Q: edwards::EdwardsPoint) -> edwards::EdwardsPoint { fn serial_add(P: edwards::EdwardsPoint, Q: edwards::EdwardsPoint) -> edwards::EdwardsPoint {
use backend::serial::u64::field::FieldElement51; use crate::backend::serial::u64::field::FieldElement51;
let (X1, Y1, Z1, T1) = (P.X, P.Y, P.Z, P.T); let (X1, Y1, Z1, T1) = (P.X, P.Y, P.Z, P.T);
let (X2, Y2, Z2, T2) = (Q.X, Q.Y, Q.Z, Q.T); let (X2, Y2, Z2, T2) = (Q.X, Q.Y, Q.Z, Q.T);
@ -420,8 +420,8 @@ mod test {
#[test] #[test]
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() { fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
use constants; use crate::constants;
use scalar::Scalar; use crate::scalar::Scalar;
println!("Testing id +- id"); println!("Testing id +- id");
let P = edwards::EdwardsPoint::identity(); let P = edwards::EdwardsPoint::identity();
@ -507,8 +507,8 @@ mod test {
#[test] #[test]
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() { fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
use constants; use crate::constants;
use scalar::Scalar; use crate::scalar::Scalar;
println!("Testing [2]id"); println!("Testing [2]id");
let P = edwards::EdwardsPoint::identity(); let P = edwards::EdwardsPoint::identity();
@ -525,8 +525,8 @@ mod test {
#[test] #[test]
fn basepoint_odd_lookup_table_verify() { fn basepoint_odd_lookup_table_verify() {
use constants; use crate::constants;
use backend::vector::avx2::constants::{BASEPOINT_ODD_LOOKUP_TABLE}; use crate::backend::vector::avx2::constants::{BASEPOINT_ODD_LOOKUP_TABLE};
let basepoint_odd_table = NafLookupTable8::<CachedPoint>::from(&constants::ED25519_BASEPOINT_POINT); let basepoint_odd_table = NafLookupTable8::<CachedPoint>::from(&constants::ED25519_BASEPOINT_POINT);
println!("basepoint_odd_lookup_table = {:?}", basepoint_odd_table); println!("basepoint_odd_lookup_table = {:?}", basepoint_odd_table);

View file

@ -43,8 +43,10 @@ const D_LANES64: u8 = 0b11_00_00_00;
use core::ops::{Add, Mul, Neg}; use core::ops::{Add, Mul, Neg};
use packed_simd::{i32x8, u32x8, u64x4, IntoBits}; use packed_simd::{i32x8, u32x8, u64x4, IntoBits};
use backend::vector::avx2::constants::{P_TIMES_16_HI, P_TIMES_16_LO, P_TIMES_2_HI, P_TIMES_2_LO}; use crate::backend::vector::avx2::constants::{
use backend::serial::u64::field::FieldElement51; P_TIMES_16_HI, P_TIMES_16_LO, P_TIMES_2_HI, P_TIMES_2_LO,
};
use crate::backend::serial::u64::field::FieldElement51;
/// Unpack 32-bit lanes into 64-bit lanes: /// Unpack 32-bit lanes into 64-bit lanes:
/// ```ascii,no_run /// ```ascii,no_run

View file

@ -11,7 +11,7 @@
use packed_simd::u64x4; use packed_simd::u64x4;
use window::NafLookupTable8; use crate::window::NafLookupTable8;
use super::edwards::{CachedPoint, ExtendedPoint}; use super::edwards::{CachedPoint, ExtendedPoint};
use super::field::{F51x4Reduced, F51x4Unreduced}; use super::field::{F51x4Reduced, F51x4Unreduced};

View file

@ -9,15 +9,15 @@
#![allow(non_snake_case)] #![allow(non_snake_case)]
use traits::Identity; use crate::traits::Identity;
use std::ops::{Add, Neg, Sub}; use std::ops::{Add, Neg, Sub};
use subtle::Choice; use subtle::Choice;
use subtle::ConditionallySelectable; use subtle::ConditionallySelectable;
use edwards; use crate::edwards;
use window::{LookupTable, NafLookupTable5, NafLookupTable8}; use crate::window::{LookupTable, NafLookupTable5, NafLookupTable8};
use super::constants; use super::constants;
use super::field::{F51x4Reduced, F51x4Unreduced, Lanes, Shuffle}; use super::field::{F51x4Reduced, F51x4Unreduced, Lanes, Shuffle};
@ -258,8 +258,8 @@ mod test {
#[test] #[test]
fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() { fn vector_addition_vs_serial_addition_vs_edwards_extendedpoint() {
use constants; use crate::constants;
use scalar::Scalar; use crate::scalar::Scalar;
println!("Testing id +- id"); println!("Testing id +- id");
let P = edwards::EdwardsPoint::identity(); let P = edwards::EdwardsPoint::identity();
@ -297,8 +297,8 @@ mod test {
#[test] #[test]
fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() { fn vector_doubling_vs_serial_doubling_vs_edwards_extendedpoint() {
use constants; use crate::constants;
use scalar::Scalar; use crate::scalar::Scalar;
println!("Testing [2]id"); println!("Testing [2]id");
let P = edwards::EdwardsPoint::identity(); let P = edwards::EdwardsPoint::identity();

View file

@ -14,7 +14,7 @@
use core::ops::{Add, Mul, Neg}; use core::ops::{Add, Mul, Neg};
use packed_simd::{u64x4, IntoBits}; use packed_simd::{u64x4, IntoBits};
use backend::serial::u64::field::FieldElement51; use crate::backend::serial::u64::field::FieldElement51;
/// A wrapper around `vpmadd52luq` that works on `u64x4`. /// A wrapper around `vpmadd52luq` that works on `u64x4`.
#[inline(always)] #[inline(always)]

View file

@ -11,13 +11,13 @@
use core::borrow::Borrow; use core::borrow::Borrow;
use backend::vector::{CachedPoint, ExtendedPoint}; use crate::backend::vector::{CachedPoint, ExtendedPoint};
use edwards::EdwardsPoint; use crate::edwards::EdwardsPoint;
use scalar::Scalar; use crate::scalar::Scalar;
use traits::{Identity, VartimeMultiscalarMul}; use crate::traits::{Identity, VartimeMultiscalarMul};
#[allow(unused_imports)] #[allow(unused_imports)]
use prelude::*; use crate::prelude::*;
/// Implements a version of Pippenger's algorithm. /// Implements a version of Pippenger's algorithm.
/// ///
@ -50,9 +50,7 @@ impl VartimeMultiscalarMul for Pippenger {
// Collect optimized scalars and points in a buffer for repeated access // Collect optimized scalars and points in a buffer for repeated access
// (scanning the whole collection per each digit position). // (scanning the whole collection per each digit position).
let scalars = scalars let scalars = scalars.into_iter().map(|s| s.borrow().to_radix_2w(w));
.into_iter()
.map(|s| s.borrow().to_radix_2w(w));
let points = points let points = points
.into_iter() .into_iter()
@ -127,8 +125,8 @@ impl VartimeMultiscalarMul for Pippenger {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use constants; use crate::constants;
use scalar::Scalar; use crate::scalar::Scalar;
#[test] #[test]
fn test_vartime_pippenger() { fn test_vartime_pippenger() {

View file

@ -13,15 +13,15 @@
use core::borrow::Borrow; use core::borrow::Borrow;
use backend::vector::{CachedPoint, ExtendedPoint}; use crate::backend::vector::{CachedPoint, ExtendedPoint};
use edwards::EdwardsPoint; use crate::edwards::EdwardsPoint;
use scalar::Scalar; use crate::scalar::Scalar;
use traits::Identity; use crate::traits::Identity;
use traits::VartimePrecomputedMultiscalarMul; use crate::traits::VartimePrecomputedMultiscalarMul;
use window::{NafLookupTable5, NafLookupTable8}; use crate::window::{NafLookupTable5, NafLookupTable8};
#[allow(unused_imports)] #[allow(unused_imports)]
use prelude::*; use crate::prelude::*;
pub struct VartimePrecomputedStraus { pub struct VartimePrecomputedStraus {

View file

@ -15,14 +15,14 @@ use core::borrow::Borrow;
use zeroize::Zeroizing; use zeroize::Zeroizing;
use backend::vector::{CachedPoint, ExtendedPoint}; use crate::backend::vector::{CachedPoint, ExtendedPoint};
use edwards::EdwardsPoint; use crate::edwards::EdwardsPoint;
use scalar::Scalar; use crate::scalar::Scalar;
use window::{LookupTable, NafLookupTable5}; use crate::window::{LookupTable, NafLookupTable5};
use traits::{Identity, MultiscalarMul, VartimeMultiscalarMul}; use crate::traits::{Identity, MultiscalarMul, VartimeMultiscalarMul};
#[allow(unused_imports)] #[allow(unused_imports)]
use prelude::*; use crate::prelude::*;
/// Multiscalar multiplication using interleaved window / Straus' /// Multiscalar multiplication using interleaved window / Straus'
/// method. See the `Straus` struct in the serial backend for more /// method. See the `Straus` struct in the serial backend for more

View file

@ -1,10 +1,10 @@
#![allow(non_snake_case)] #![allow(non_snake_case)]
use backend::vector::{CachedPoint, ExtendedPoint}; use crate::backend::vector::{CachedPoint, ExtendedPoint};
use edwards::EdwardsPoint; use crate::edwards::EdwardsPoint;
use scalar::Scalar; use crate::scalar::Scalar;
use traits::Identity; use crate::traits::Identity;
use window::LookupTable; use crate::window::LookupTable;
/// Perform constant-time, variable-base scalar multiplication. /// Perform constant-time, variable-base scalar multiplication.
pub fn mul(point: &EdwardsPoint, scalar: &Scalar) -> EdwardsPoint { pub fn mul(point: &EdwardsPoint, scalar: &Scalar) -> EdwardsPoint {

View file

@ -11,12 +11,12 @@
#![allow(non_snake_case)] #![allow(non_snake_case)]
use backend::vector::BASEPOINT_ODD_LOOKUP_TABLE; use crate::backend::vector::BASEPOINT_ODD_LOOKUP_TABLE;
use backend::vector::{CachedPoint, ExtendedPoint}; use crate::backend::vector::{CachedPoint, ExtendedPoint};
use edwards::EdwardsPoint; use crate::edwards::EdwardsPoint;
use scalar::Scalar; use crate::scalar::Scalar;
use traits::Identity; use crate::traits::Identity;
use window::NafLookupTable5; use crate::window::NafLookupTable5;
/// Compute \\(aA + bB\\) in variable time, where \\(B\\) is the Ed25519 basepoint. /// Compute \\(aA + bB\\) in variable time, where \\(B\\) is the Ed25519 basepoint.
pub fn mul(a: &Scalar, A: &EdwardsPoint, b: &Scalar) -> EdwardsPoint { pub fn mul(a: &Scalar, A: &EdwardsPoint, b: &Scalar) -> EdwardsPoint {

View file

@ -148,7 +148,7 @@ use crate::backend::serial::scalar_mul;
feature = "simd_backend", feature = "simd_backend",
any(target_feature = "avx2", target_feature = "avx512ifma") any(target_feature = "avx2", target_feature = "avx512ifma")
))] ))]
use backend::vector::scalar_mul; use crate::backend::vector::scalar_mul;
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Compressed points // Compressed points

View file

@ -202,7 +202,7 @@ use crate::backend::serial::scalar_mul;
feature = "simd_backend", feature = "simd_backend",
any(target_feature = "avx2", target_feature = "avx512ifma") any(target_feature = "avx2", target_feature = "avx512ifma")
))] ))]
use backend::vector::scalar_mul; use crate::backend::vector::scalar_mul;
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Compressed points // Compressed points