Skip to content

phadej/vec

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ecfb567 · Nov 9, 2024
Aug 24, 2024
Aug 24, 2024
Nov 9, 2024
Jun 8, 2024
Jun 8, 2024
Aug 24, 2024
Aug 24, 2024
Jun 8, 2024
Jun 8, 2024
Aug 24, 2024
Dec 8, 2019
Mar 20, 2023
Mar 12, 2021
Dec 3, 2019
Jun 19, 2019
Dec 1, 2019
Nov 30, 2019
Mar 23, 2019
Jun 8, 2024
Aug 22, 2022
Dec 2, 2019
Nov 30, 2019

Repository files navigation

fin and vec

Vec

vec provides few approache to work with Vec:

  • naive: explicit recusion
    • no need to keep constraints around for most functions
    • simple
    • slow
  • pull: Vec n a represented as Fin n -> a
    • Fuses well
    • Some code is hard to write (e.g. Traversable)
    • relatively simple
  • inline, using InlineInduction:
    • exploits how GHC dictionary resolution works
    • makes code to unroll completely for staticaly known sizes
    • fast in that case

Dependencies

And with dependency flags turned off:

Benchmarks: dotProduct

  • list version sets the baseline, built-in fusion seems to kick in.
  • vector and unboxed vector are 3x slower.
  • this library, naive vec is even slower
  • Data.Vec.Pull approach is slower, except
  • that without conversions it's up to speed with vector
  • inline (using InlineInduction over size) is faster than list version.
benchmarking dot product/list
time                 23.73 ns   (23.61 ns .. 23.88 ns)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 23.69 ns   (23.58 ns .. 23.89 ns)
std dev              450.1 ps   (292.0 ps .. 731.3 ps)
variance introduced by outliers: 27% (moderately inflated)

benchmarking dot product/vector
time                 80.74 ns   (80.16 ns .. 81.42 ns)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 80.83 ns   (80.23 ns .. 82.21 ns)
std dev              2.760 ns   (1.657 ns .. 4.830 ns)
variance introduced by outliers: 53% (severely inflated)

benchmarking dot product/unboxed
time                 79.95 ns   (79.34 ns .. 80.74 ns)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 80.44 ns   (79.61 ns .. 82.51 ns)
std dev              4.278 ns   (2.029 ns .. 7.869 ns)
variance introduced by outliers: 74% (severely inflated)

benchmarking dot product/vec
time                 130.2 ns   (129.0 ns .. 131.6 ns)
                     0.999 R²   (0.999 R² .. 1.000 R²)
mean                 130.1 ns   (129.1 ns .. 131.7 ns)
std dev              4.185 ns   (3.108 ns .. 5.425 ns)
variance introduced by outliers: 49% (moderately inflated)

benchmarking dot product/pull
time                 245.3 ns   (245.1 ns .. 245.5 ns)
                     1.000 R²   (0.999 R² .. 1.000 R²)
mean                 246.3 ns   (244.7 ns .. 254.1 ns)
std dev              9.924 ns   (409.7 ps .. 22.69 ns)
variance introduced by outliers: 59% (severely inflated)

benchmarking dot product/pull'
time                 71.18 ns   (70.73 ns .. 71.64 ns)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 70.79 ns   (70.44 ns .. 71.30 ns)
std dev              1.397 ns   (925.3 ps .. 2.095 ns)
variance introduced by outliers: 27% (moderately inflated)

benchmarking dot product/inline
time                 20.91 ns   (20.64 ns .. 21.25 ns)
                     0.999 R²   (0.998 R² .. 0.999 R²)
mean                 21.12 ns   (20.90 ns .. 21.37 ns)
std dev              784.4 ps   (575.5 ps .. 1.107 ns)
variance introduced by outliers: 60% (severely inflated)