Skip to content

Commit b55b23f

Browse files
committed
added simd optimizations for gradients and hessians
1 parent bd8a4d2 commit b55b23f

30 files changed

Lines changed: 2563 additions & 585 deletions

Cargo.lock

Lines changed: 48 additions & 48 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ readme = "README.md"
1111
keywords = ["curve-fitting", "spline", "optimization", "egui", "wasm"]
1212
categories = ["science", "mathematics", "visualization", "gui"]
1313

14-
[features]
15-
default = ["portable-simd"]
16-
portable-simd = []
17-
1814
[dependencies]
1915
argmin = { version = "0.11.0", default-features = false }
2016
argmin-math = { version = "0.5.1", default-features = false, features = [

src/fit.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ pub use spline::{
4545
fit_natural_cubic_spline_with_config, fit_natural_cubic_spline_with_optimizer_config,
4646
};
4747

48-
#[cfg(feature = "portable-simd")]
4948
#[doc(hidden)]
5049
pub mod simd_bench {
5150
use super::{OptimizationLossMetric, simd};

src/fit/simd.rs

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
use super::{LARGE_COST, OptimizationLossMetric, positive_x};
22

3-
#[cfg(feature = "portable-simd")]
43
const MAX_POLYNOMIAL_PARAMS: usize = 10;
54

6-
#[cfg(feature = "portable-simd")]
75
#[cfg(not(target_arch = "wasm32"))]
86
type Vf64 = std::simd::f64x8;
9-
#[cfg(feature = "portable-simd")]
107
#[cfg(target_arch = "wasm32")]
118
type Vf64 = std::simd::f64x2;
129

13-
#[cfg(feature = "portable-simd")]
1410
use std::simd::Select;
15-
#[cfg(feature = "portable-simd")]
1611
use std::simd::StdFloat;
17-
#[cfg(feature = "portable-simd")]
1812
use std::simd::cmp::SimdPartialOrd;
19-
#[cfg(feature = "portable-simd")]
2013
use std::simd::num::SimdFloat;
2114

2215
pub(super) fn polynomial_cost(
@@ -25,14 +18,7 @@ pub(super) fn polynomial_cost(
2518
y_values: &[f64],
2619
loss_metric: OptimizationLossMetric,
2720
) -> f64 {
28-
#[cfg(feature = "portable-simd")]
29-
{
30-
polynomial_cost_simd(param, x_values, y_values, loss_metric)
31-
}
32-
#[cfg(not(feature = "portable-simd"))]
33-
{
34-
polynomial_cost_scalar(param, x_values, y_values, loss_metric)
35-
}
21+
polynomial_cost_simd(param, x_values, y_values, loss_metric)
3622
}
3723

3824
pub(super) fn inverse_cost(
@@ -41,14 +27,7 @@ pub(super) fn inverse_cost(
4127
y_values: &[f64],
4228
loss_metric: OptimizationLossMetric,
4329
) -> f64 {
44-
#[cfg(feature = "portable-simd")]
45-
{
46-
inverse_cost_simd(param, x_values, y_values, loss_metric)
47-
}
48-
#[cfg(not(feature = "portable-simd"))]
49-
{
50-
inverse_cost_scalar(param, x_values, y_values, loss_metric)
51-
}
30+
inverse_cost_simd(param, x_values, y_values, loss_metric)
5231
}
5332

5433
pub(super) fn accumulate_polynomial_gradient(
@@ -58,14 +37,7 @@ pub(super) fn accumulate_polynomial_gradient(
5837
loss_metric: OptimizationLossMetric,
5938
gradient: &mut [f64],
6039
) {
61-
#[cfg(feature = "portable-simd")]
62-
{
63-
accumulate_polynomial_gradient_simd(x_values, y_values, param, loss_metric, gradient);
64-
}
65-
#[cfg(not(feature = "portable-simd"))]
66-
{
67-
accumulate_polynomial_gradient_scalar(x_values, y_values, param, loss_metric, gradient);
68-
}
40+
accumulate_polynomial_gradient_simd(x_values, y_values, param, loss_metric, gradient);
6941
}
7042

7143
pub(super) fn accumulate_inverse_gradient(
@@ -75,14 +47,7 @@ pub(super) fn accumulate_inverse_gradient(
7547
loss_metric: OptimizationLossMetric,
7648
gradient: &mut [f64],
7749
) {
78-
#[cfg(feature = "portable-simd")]
79-
{
80-
accumulate_inverse_gradient_simd(x_values, y_values, param, loss_metric, gradient);
81-
}
82-
#[cfg(not(feature = "portable-simd"))]
83-
{
84-
accumulate_inverse_gradient_scalar(x_values, y_values, param, loss_metric, gradient);
85-
}
50+
accumulate_inverse_gradient_simd(x_values, y_values, param, loss_metric, gradient);
8651
}
8752

8853
pub(super) fn polynomial_cost_scalar(
@@ -205,7 +170,6 @@ pub(super) fn accumulate_inverse_gradient_scalar(
205170
}
206171
}
207172

208-
#[cfg(feature = "portable-simd")]
209173
fn value_from_residual_simd(loss_metric: OptimizationLossMetric, residual: Vf64) -> Vf64 {
210174
match loss_metric {
211175
OptimizationLossMetric::Mse => residual * residual,
@@ -217,7 +181,6 @@ fn value_from_residual_simd(loss_metric: OptimizationLossMetric, residual: Vf64)
217181
}
218182
}
219183

220-
#[cfg(feature = "portable-simd")]
221184
fn residual_derivative_simd(loss_metric: OptimizationLossMetric, residual: Vf64) -> Vf64 {
222185
match loss_metric {
223186
OptimizationLossMetric::Mse => Vf64::splat(2.0) * residual,
@@ -235,7 +198,6 @@ fn residual_derivative_simd(loss_metric: OptimizationLossMetric, residual: Vf64)
235198
}
236199
}
237200

238-
#[cfg(feature = "portable-simd")]
239201
pub(super) fn polynomial_cost_simd(
240202
param: &[f64],
241203
x_values: &[f64],
@@ -293,7 +255,6 @@ pub(super) fn polynomial_cost_simd(
293255
}
294256
}
295257

296-
#[cfg(feature = "portable-simd")]
297258
pub(super) fn inverse_cost_simd(
298259
param: &[f64],
299260
x_values: &[f64],
@@ -344,7 +305,6 @@ pub(super) fn inverse_cost_simd(
344305
}
345306
}
346307

347-
#[cfg(feature = "portable-simd")]
348308
pub(super) fn accumulate_polynomial_gradient_simd(
349309
x_values: &[f64],
350310
y_values: &[f64],
@@ -398,7 +358,6 @@ pub(super) fn accumulate_polynomial_gradient_simd(
398358
}
399359
}
400360

401-
#[cfg(feature = "portable-simd")]
402361
pub(super) fn accumulate_inverse_gradient_simd(
403362
x_values: &[f64],
404363
y_values: &[f64],

src/fit/tests.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#[cfg(feature = "portable-simd")]
21
use super::simd;
32
use super::{
43
CurveProblem, CurveProblemPredictionLoss, DEFAULT_SPLINE_KNOTS, FitError,
@@ -1616,7 +1615,6 @@ fn fit_curve_with_optimizer_config_can_be_cancelled_via_progress_callback() {
16161615
assert!(matches!(result, Err(FitError::Cancelled)));
16171616
}
16181617

1619-
#[cfg(feature = "portable-simd")]
16201618
fn assert_close(actual: f64, expected: f64, abs_tolerance: f64, rel_tolerance: f64) {
16211619
let delta = (actual - expected).abs();
16221620
let scale = expected.abs().max(1.0);
@@ -1626,7 +1624,6 @@ fn assert_close(actual: f64, expected: f64, abs_tolerance: f64, rel_tolerance: f
16261624
);
16271625
}
16281626

1629-
#[cfg(feature = "portable-simd")]
16301627
fn test_xy_for_polynomial() -> (Vec<f64>, Vec<f64>, Vec<f64>) {
16311628
let param = vec![0.3, -0.2, 0.08, -0.005, 1.7, -4.0];
16321629
let x_values = (0..1031)
@@ -1646,7 +1643,6 @@ fn test_xy_for_polynomial() -> (Vec<f64>, Vec<f64>, Vec<f64>) {
16461643
(param, x_values, y_values)
16471644
}
16481645

1649-
#[cfg(feature = "portable-simd")]
16501646
fn test_xy_for_inverse() -> (Vec<f64>, Vec<f64>, Vec<f64>) {
16511647
let param = vec![1.25, -0.7];
16521648
let x_values = (0..1019)
@@ -1663,7 +1659,6 @@ fn test_xy_for_inverse() -> (Vec<f64>, Vec<f64>, Vec<f64>) {
16631659
(param, x_values, y_values)
16641660
}
16651661

1666-
#[cfg(feature = "portable-simd")]
16671662
#[test]
16681663
fn simd_polynomial_cost_matches_scalar_reference_for_all_loss_metrics() {
16691664
let (param, x_values, y_values) = test_xy_for_polynomial();
@@ -1674,7 +1669,6 @@ fn simd_polynomial_cost_matches_scalar_reference_for_all_loss_metrics() {
16741669
}
16751670
}
16761671

1677-
#[cfg(feature = "portable-simd")]
16781672
#[test]
16791673
fn simd_inverse_cost_matches_scalar_reference_for_all_loss_metrics() {
16801674
let (param, x_values, y_values) = test_xy_for_inverse();
@@ -1685,7 +1679,6 @@ fn simd_inverse_cost_matches_scalar_reference_for_all_loss_metrics() {
16851679
}
16861680
}
16871681

1688-
#[cfg(feature = "portable-simd")]
16891682
#[test]
16901683
fn simd_polynomial_gradient_matches_scalar_reference_for_all_loss_metrics() {
16911684
let (param, x_values, y_values) = test_xy_for_polynomial();
@@ -1714,7 +1707,6 @@ fn simd_polynomial_gradient_matches_scalar_reference_for_all_loss_metrics() {
17141707
}
17151708
}
17161709

1717-
#[cfg(feature = "portable-simd")]
17181710
#[test]
17191711
fn simd_inverse_gradient_matches_scalar_reference_for_all_loss_metrics() {
17201712
let (param, x_values, y_values) = test_xy_for_inverse();
@@ -1743,7 +1735,6 @@ fn simd_inverse_gradient_matches_scalar_reference_for_all_loss_metrics() {
17431735
}
17441736
}
17451737

1746-
#[cfg(feature = "portable-simd")]
17471738
#[test]
17481739
fn polynomial_cost_with_quantization_uses_quantized_scalar_pipeline() {
17491740
use argmin::core::CostFunction;
@@ -1761,7 +1752,6 @@ fn polynomial_cost_with_quantization_uses_quantized_scalar_pipeline() {
17611752
assert_near(cost, 1.5129, 1e-12);
17621753
}
17631754

1764-
#[cfg(feature = "portable-simd")]
17651755
#[test]
17661756
fn simd_cost_returns_large_cost_for_non_finite_inputs() {
17671757
let x_values = vec![0.1, 0.2, 0.3];

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![cfg_attr(feature = "portable-simd", feature(portable_simd))]
1+
#![feature(portable_simd)]
22
#![forbid(unsafe_code)]
33
//! Публичный API библиотеки для подгонки параметрических кривых и сплайнов.
44

src/models.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ mod power;
3232
mod pseudo_voigt;
3333
mod rational_11;
3434
mod rational_22;
35+
#[cfg(test)]
36+
mod simd_tests;
3537
mod softplus;
3638
mod term;
3739
#[cfg(test)]

0 commit comments

Comments
 (0)