#tan #arithmetic #sin #cos #integer-arithmetic

erydanos

针对 ARM NEON 和 SSE 优化的例程

17 个版本

新版本 0.2.14 2024 年 8 月 19 日
0.2.13 2024 年 8 月 19 日
0.2.11 2024 年 7 月 31 日
0.1.1 2024 年 7 月 10 日

#207 in 数学

Download history 45/week @ 2024-07-03 478/week @ 2024-07-10 613/week @ 2024-07-17 147/week @ 2024-07-24 415/week @ 2024-07-31 32/week @ 2024-08-07 231/week @ 2024-08-14

835 每月下载量
用于 5 个 crates (2 直接)

Apache-2.0 OR BSD-3-Clause

460KB
12K SLoC

用于 NEON、SSE、AVX 和标量实现的数学工具

包含标量实现、NEON simd 和 SSE 以及 AVX 的基本数学例程。所有实现均使用单精度和双精度。几乎所有例程的 ULP 都小于 1.5,这对于媒体处理应用来说是绝对足够的(对于某些媒体应用可能过高)。所有方法对于通用用途都足够快。性能与 libm 相当,有时更快,有时更慢,但可能不如 CPU 集成解决方案。添加了 NEON(双精度、双精度)类型,以及 uint128。为 SSE 添加了 64 位整数算术。

实现的例程

  • abs
  • acos
  • asin
  • atan
  • atan2
  • cbrt
  • floor
  • exp
  • fmod
  • ln
  • hypot
  • pow
  • sin
  • cos
  • tan
  • sqrt
  • ceil
  • hypot3
  • hypot4

示例

let value = 0.1f32.esin();

// For NEON simd
let value = vsinq_f32(vdupq_n_f32(0.1f32));

与 libm 的性能比较

艾尔达诺斯正弦时间:[17.785 ns 17.884 ns 18.095 ns]
libm 正弦时间:[27.928 ns 28.595 ns 29.398 ns]

艾尔达诺斯正切时间:[27.593 ns 27.607 ns 27.621 ns]
libm 正切时间:[28.854 ns 29.165 ns 29.467 ns]

艾尔达诺斯立方根时间:[23.260 ns 23.452 ns 23.650 ns]
艾尔达诺斯立方根时间:[23.260 ns 23.452 ns 23.650 ns]

艾尔达诺斯幂时间:[66.930 ns 67.465 ns 68.025 ns]
libm 幂时间:[170.74 ns 172.71 ns 174.67 ns]

艾尔达诺斯反正弦时间:[23.730 ns 23.953 ns 24.156 ns]
libm 反正弦时间:[349.02 ns 350.39 ns 352.24 ns]

艾尔达诺斯反正切时间:[20.882 ns 21.115 ns 21.347 ns]
libm 反正切时间:[20.128 ns 20.309 ns 20.494 ns]

依赖项