Skip to content

Commit 8c24e08

Browse files
committed
Updates to benchmarks without planners
1 parent b882363 commit 8c24e08

File tree

5 files changed

+70
-15
lines changed

5 files changed

+70
-15
lines changed

examples/benchmark.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@ use std::str::FromStr;
33

44
use utilities::gen_random_signal;
55

6-
use phastft::fft_64;
7-
use phastft::planner::Direction;
6+
use phastft::fft_64_with_opts_and_plan;
7+
use phastft::options::Options;
8+
use phastft::planner::{Direction, Planner64};
89

910
fn benchmark_fft_64(n: usize) {
1011
let big_n = 1 << n;
1112
let mut reals = vec![0.0; big_n];
1213
let mut imags = vec![0.0; big_n];
1314
gen_random_signal(&mut reals, &mut imags);
1415

16+
let planner = Planner64::new(reals.len(), Direction::Forward);
17+
let opts = Options::guess_options(reals.len());
18+
1519
let now = std::time::Instant::now();
16-
fft_64(&mut reals, &mut imags, Direction::Forward);
20+
fft_64_with_opts_and_plan(&mut reals, &mut imags, &opts, &planner);
1721
let elapsed = now.elapsed().as_micros();
1822
println!("{elapsed}");
1923
}

examples/profile.rs

+18-9
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
use std::env;
22
use std::str::FromStr;
33

4-
use phastft::fft_64;
5-
use phastft::planner::Direction;
6-
7-
fn benchmark_fft(num_qubits: usize) {
8-
let n = 1 << num_qubits;
9-
let mut reals: Vec<f64> = (1..=n).map(|i| i as f64).collect();
10-
let mut imags: Vec<f64> = (1..=n).map(|i| i as f64).collect();
11-
fft_64(&mut reals, &mut imags, Direction::Forward);
4+
use utilities::gen_random_signal;
5+
6+
use phastft::fft_64_with_opts_and_plan;
7+
use phastft::options::Options;
8+
use phastft::planner::{Direction, Planner64};
9+
10+
fn benchmark_fft_64(n: usize) {
11+
let big_n = 1 << n;
12+
let mut reals = vec![0.0; big_n];
13+
let mut imags = vec![0.0; big_n];
14+
gen_random_signal(&mut reals, &mut imags);
15+
16+
let planner = Planner64::new(reals.len(), Direction::Forward);
17+
let opts = Options::guess_options(reals.len());
18+
19+
fft_64_with_opts_and_plan(&mut reals, &mut imags, &opts, &planner);
1220
}
1321

1422
fn main() {
1523
let args: Vec<String> = env::args().collect();
1624
assert_eq!(args.len(), 2, "Usage {} <n>", args[0]);
1725

1826
let n = usize::from_str(&args[1]).unwrap();
19-
benchmark_fft(n);
27+
28+
benchmark_fft_64(n);
2029
}

examples/rustfft.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use utilities::{
99
fn benchmark_rustfft(n: usize) {
1010
let big_n = 1 << n;
1111

12-
let mut reals = vec![0.0; big_n];
13-
let mut imags = vec![0.0; big_n];
12+
let mut reals = vec![0.0f64; big_n];
13+
let mut imags = vec![0.0f64; big_n];
1414

1515
gen_random_signal(&mut reals, &mut imags);
1616
let mut signal = vec![Complex64::default(); big_n];
@@ -23,9 +23,10 @@ fn benchmark_rustfft(n: usize) {
2323
z.im = im;
2424
});
2525

26-
let now = std::time::Instant::now();
2726
let mut planner = FftPlanner::new();
2827
let fft = planner.plan_fft_forward(signal.len());
28+
29+
let now = std::time::Instant::now();
2930
fft.process(&mut signal);
3031
let elapsed = now.elapsed().as_micros();
3132
println!("{elapsed}");

src/kernels.rs

+32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ use num_traits::Float;
44

55
macro_rules! fft_butterfly_n_simd {
66
($func_name:ident, $precision:ty, $lanes:literal, $simd_vector:ty) => {
7+
#[multiversion::multiversion(targets("x86_64+avx512f+avx512bw+avx512cd+avx512dq+avx512vl", // x86_64-v4
8+
"x86_64+avx2+fma", // x86_64-v3
9+
"x86_64+sse4.2", // x86_64-v2
10+
"x86+avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
11+
"x86+avx2+fma",
12+
"x86+sse4.2",
13+
"x86+sse2",
14+
))]
715
#[inline]
816
pub fn $func_name(
917
reals: &mut [$precision],
@@ -52,6 +60,14 @@ macro_rules! fft_butterfly_n_simd {
5260
fft_butterfly_n_simd!(fft_64_chunk_n_simd, f64, 8, f64x8);
5361
fft_butterfly_n_simd!(fft_32_chunk_n_simd, f32, 16, f32x16);
5462

63+
#[multiversion::multiversion(targets("x86_64+avx512f+avx512bw+avx512cd+avx512dq+avx512vl", // x86_64-v4
64+
"x86_64+avx2+fma", // x86_64-v3
65+
"x86_64+sse4.2", // x86_64-v2
66+
"x86+avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
67+
"x86+avx2+fma",
68+
"x86+sse4.2",
69+
"x86+sse2",
70+
))]
5571
#[inline]
5672
pub(crate) fn fft_chunk_n<T: Float>(
5773
reals: &mut [T],
@@ -93,6 +109,14 @@ pub(crate) fn fft_chunk_n<T: Float>(
93109
}
94110

95111
/// `chunk_size == 4`, so hard code twiddle factors
112+
#[multiversion::multiversion(targets("x86_64+avx512f+avx512bw+avx512cd+avx512dq+avx512vl", // x86_64-v4
113+
"x86_64+avx2+fma", // x86_64-v3
114+
"x86_64+sse4.2", // x86_64-v2
115+
"x86+avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
116+
"x86+avx2+fma",
117+
"x86+sse4.2",
118+
"x86+sse2",
119+
))]
96120
#[inline]
97121
pub(crate) fn fft_chunk_4<T: Float>(reals: &mut [T], imags: &mut [T]) {
98122
let dist = 2;
@@ -128,6 +152,14 @@ pub(crate) fn fft_chunk_4<T: Float>(reals: &mut [T], imags: &mut [T]) {
128152
}
129153

130154
/// `chunk_size == 2`, so skip phase
155+
#[multiversion::multiversion(targets("x86_64+avx512f+avx512bw+avx512cd+avx512dq+avx512vl", // x86_64-v4
156+
"x86_64+avx2+fma", // x86_64-v3
157+
"x86_64+sse4.2", // x86_64-v2
158+
"x86+avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
159+
"x86+avx2+fma",
160+
"x86+sse4.2",
161+
"x86+sse2",
162+
))]
131163
#[inline]
132164
pub(crate) fn fft_chunk_2<T: Float>(reals: &mut [T], imags: &mut [T]) {
133165
reals

src/twiddles.rs

+9
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ macro_rules! generate_twiddles_simd {
184184
generate_twiddles_simd!(generate_twiddles_simd_64, f64, 8, f64x8);
185185
generate_twiddles_simd!(generate_twiddles_simd_32, f32, 8, f32x8);
186186

187+
#[multiversion::multiversion(
188+
targets("x86_64+avx512f+avx512bw+avx512cd+avx512dq+avx512vl", // x86_64-v4
189+
"x86_64+avx2+fma", // x86_64-v3
190+
"x86_64+sse4.2", // x86_64-v2
191+
"x86+avx512f+avx512bw+avx512cd+avx512dq+avx512vl",
192+
"x86+avx2+fma",
193+
"x86+sse4.2",
194+
"x86+sse2",
195+
))]
187196
#[inline]
188197
pub(crate) fn filter_twiddles<T: Float>(twiddles_re: &[T], twiddles_im: &[T]) -> (Vec<T>, Vec<T>) {
189198
assert_eq!(twiddles_re.len(), twiddles_im.len());

0 commit comments

Comments
 (0)