2 个不稳定版本

0.2.0 2020 年 4 月 26 日
0.1.0 2019 年 10 月 21 日

#598硬件支持


submerge 中使用

MIT/Apache

105KB
2K SLoC

Newel

此包提供一组大量同质切片类型的操作。它应作为集合导向的评估器的构建块,这些评估器不使用 JIT,但仍希望从一组固定的类型专用内循环中获得良好的性能。它提供了三个显著特性

  1. 在单个编译单元中隔离了所有原始类型上的所有原始操作的笛卡尔积的代码放大因子,编译成(尽可能)高效的 SIMD 循环。它们只在这里编译一次。

  2. 抽象出运行时选择最有效实现的问题(例如,rayon 块处理 & SIMD,未来可能还有 GPU)。

  3. 提供“外部”列-列或与常量的动态双重分派,这些分派预计将在内循环上摊销,以及从操作到函数的动态分派。尽管在内部运行速度很快,但此包中没有任何内容会大量内联到其用户中!

这是在 APL 评估器或列导向数据库中使用的构建块,其中外层是 解释器,它通过使所有 内部 层都运行得很快来保持良好的但不是最佳的性能:这里的同质切片类型运算符。对于数据密集型程序,这是一个简单的策略,似乎效果很好,因为外部的解释器循环只返回相对较少,并且这些内部循环的代码大小在解释器中编译一次,因此对所有用户程序来说是恒定的,并且相对缓存友好。

参考文献

T. Kersten, V. Leis, A. Kemper, T. Neumann, A. Pavlo, P. Boncz. Everything You Always Wanted to Know About Compiled and Vectorized Queries But Were Afraid to Ask. PVLDB, 11 (13): 2209 - 2222, 2018.

DOI: https://doi.org/10.14778/3275366.3275370

http://www.vldb.org/pvldb/vol11/p2209-kersten.pdf

性能

在 16MB 列对的上下文中运行的基准测试。

与标量循环相比的 SIMD 加速

$ RAYON_NUM_THREADS=1 cargo bench
test add_u32_newel  ... bench:   1,056,316 ns/iter (+/- 455,605) = 3970 MB/s
test add_u32_scalar ... bench:   2,099,241 ns/iter (+/- 37,008) = 1998 MB/s
test add_u64_newel  ... bench:   2,265,895 ns/iter (+/- 300,628) = 3702 MB/s
test add_u64_scalar ... bench:   2,202,050 ns/iter (+/- 84,681) = 3809 MB/s
test add_u8_newel   ... bench:     346,318 ns/iter (+/- 58,334) = 3027 MB/s
test add_u8_scalar  ... bench:   2,089,541 ns/iter (+/- 52,697) = 501 MB/s
test lt_u16_newel   ... bench:     392,897 ns/iter (+/- 74,161) = 5337 MB/s
test lt_u16_scalar  ... bench:   1,800,218 ns/iter (+/- 85,009) = 1164 MB/s
test lt_u32_newel   ... bench:     636,441 ns/iter (+/- 122,298) = 6590 MB/s
test lt_u32_scalar  ... bench:   2,101,893 ns/iter (+/- 63,897) = 1995 MB/s
test lt_u8_newel    ... bench:     335,296 ns/iter (+/- 45,917) = 3127 MB/s
test lt_u8_scalar   ... bench:   2,105,158 ns/iter (+/- 57,694) = 498 MB/s

加上线程级别的并行加速

$ RAYON_NUM_THREADS=40 cargo bench
test add_u32_newel  ... bench:     163,534 ns/iter (+/- 31,830) = 25647 MB/s
test add_u32_scalar ... bench:   2,112,953 ns/iter (+/- 87,481) = 1985 MB/s
test add_u64_newel  ... bench:     283,384 ns/iter (+/- 58,405) = 29601 MB/s
test add_u64_scalar ... bench:   2,254,990 ns/iter (+/- 104,615) = 3720 MB/s
test add_u8_newel   ... bench:      78,888 ns/iter (+/- 19,092) = 13291 MB/s
test add_u8_scalar  ... bench:   2,099,180 ns/iter (+/- 70,613) = 499 MB/s
test lt_u16_newel   ... bench:      99,430 ns/iter (+/- 30,703) = 21091 MB/s
test lt_u16_scalar  ... bench:   1,821,691 ns/iter (+/- 58,804) = 1151 MB/s
test lt_u32_newel   ... bench:     129,451 ns/iter (+/- 39,019) = 32400 MB/s
test lt_u32_scalar  ... bench:   2,102,977 ns/iter (+/- 27,062) = 1994 MB/s
test lt_u8_newel    ... bench:      73,589 ns/iter (+/- 20,625) = 14249 MB/s
test lt_u8_scalar   ... bench:   2,114,156 ns/iter (+/- 82,354) = 495 MB/s

名称

维基百科

新艾尔,也称为中心柱或支撑柱,是楼梯的中心支撑柱。

依赖关系

~2.5MB
~50K SLoC