#simd #vectorization #high-level #intrinsics #vectorized #low-level #architecture-specific

nightly no-std npsimd

针对特定架构矢量化的一种易用库

3个不稳定版本

0.2.1 2024年7月18日
0.2.0 2024年7月17日
0.1.0 2024年7月14日

#269 in 硬件支持

Download history 247/week @ 2024-07-12 65/week @ 2024-07-19 7/week @ 2024-07-26 1/week @ 2024-08-02

每月320次下载

MIT 许可证

150KB
2.5K SLoC

Rust的不可移植SIMD

在编写高性能矢量化代码时,利用特定架构的SIMD功能是绝对必要的。但在抽象该功能的“可移植SIMD”库中,这是不可能的。这个Rust库旨在提供一个类型安全且高级的接口来与平台特定的SIMD内联函数协同工作,提供比内联汇编或C样式的内联函数更易用的体验。

警告:此库目前正在开发中,尚不适合生产使用。仍在设计高级API,并且尚未实施严格的测试系统。

低级接口

以下是一个使用低级API中Intel SSE2内联函数的示例

use npsimd::intel_feature_set;
use npsimd::intel::low::RuntimeSupport;
use npsimd::intel::low::sse::{Use, SSE2};

// Determine the current CPU's feature support.
let support = RuntimeSupport::detect();

// Request the SSE generation with SSE2 support.
type U = Use<intel_feature_set!(SSE2)>;
let u = U::new(&support).expect("SSE2 is not supported!");

// Use arbitrary SSE2 intrinsics with ergonomic typing.
let x = u.set_u16x8([1, 3, 5, 7, 9, 11, 13, 15]);
let y = u.set_u16x8([5, 7, 9, 11, 13, 15, 17, 19]);
let z = u.avg_u16x8(x, y);
assert_eq!(z, u.set_u16x8([3, 5, 7, 9, 11, 13, 15, 17]));

许可证

版权所有 (c) 2024 Arav K. [email protected]

在此特此授予任何获得本软件及其相关文档副本(“软件”)的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供的人这样做,但受以下条件约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论源于合同、侵权或其他原因,无论是否因软件或软件的使用或其他方式而产生。

依赖项

~610KB
~11K SLoC