3 个版本 (破坏性更新)
新版本 0.4.0 | 2024 年 8 月 11 日 |
---|---|
0.3.0 | 2024 年 2 月 17 日 |
0.2.0 | 2023 年 11 月 2 日 |
165 在 硬件支持
每月 86 次下载
用于 multivers-runner
170KB
2.5K SLoC
notstd::detect
- Rust 标准库的运行时 CPU 特性检测的分支
私有的 std::detect
模块实现了 Rust 标准库中的运行时特性检测。这允许检测运行程序的 CPU 是否支持某些特性,如 SIMD 指令。
使用方法
std::detect
API 作为 libstd
的一部分提供。建议通过标准库而不是通过此 crate 使用它。 std::detect
中的不稳定特性在 nightly Rust 后面通过各种功能门提供。
如果你需要在 #[no_std]
环境中进行运行时特性检测,Rust core
库无法帮助你。按照设计,Rust core
是平台无关的,但进行运行时特性检测需要平台的一定程度的合作。
然后你可以手动将 std_detect
作为依赖项包含,以获得与 Rust 标准库提供的类似运行时特性检测支持。我们打算使 std_detect
在此方面更加灵活和可配置,以更好地满足 #[no_std]
目标的需求。
特性
-
std_detect_dlsym_getauxval
(默认启用,需要libc
):启用后,可以使用libc::dlsym
来查询是否将getauxval
链接到二进制文件中。如果未这样做,该功能允许其他回退方法执行运行时功能检测。当此功能禁用时,std_detect
假定getauxval
已链接到二进制文件。如果不是这样,则行为未定义。注意:此功能在
*-linux-gnu*
和*-android*
目标上被忽略,因为我们可以安全地假设getauxval
已链接到二进制文件。*-linux-gnu*
目标(自 Rust 1.64以来)具有比 glibc 2.16 更高的 glibc 要求,后者添加了getauxval
。*-android*
目标(自 Rust 1.68以来)具有比 Android 4.3(API 级别 18) 更高的最低支持 API 级别,后者添加了getauxval
。
-
std_detect_file_io
(默认启用,需要std
):如果其他更高效的方法失败,则启用使用文件 API(例如/proc/cpuinfo
等)执行运行时功能检测。此功能需要libstd
作为依赖项,防止包在std
不可用的情况下运行。
平台支持
-
所有
x86
/x86_64
目标都通过直接查询cpuid
指令来支持所有平台,以确定硬件和操作系统能够支持的功能。std_detect
假定二进制文件是用户空间应用程序。如果您需要查询cpuid
的原始支持,请考虑使用cupid
包。 -
Linux/Android
arm{32, 64}
、mips{32,64}{,el}
、powerpc{32,64}{,le}
、riscv{32,64}
、loongarch64
:通过查询 ELF 辅助向量(如果可用,则使用getauxval
)来支持 Linux 上的这些目标,如果失败,则通过查询/proc/cpuinfo
。arm64
:Linux >= 4.11已实现通过直接查询mrs
进行运行时特性检测的部分支持,但默认未启用。
-
FreeBSD
arm32
、powerpc64
:通过使用sysctl
查询ELF辅助向量,std_detect
在FreeBSD上支持这些。arm64
:通过直接查询mrs
实现运行时特性检测。
-
OpenBSD
arm64
:通过查询sysctl
实现运行时特性检测。
-
Windows
arm64
:通过查询IsProcessorFeaturePresent
实现运行时特性检测。
许可证
此项目根据您的选择受以下任一许可证的许可:
- Apache许可证2.0版本,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交给std_detect
的任何有意贡献都应如上双许可,没有任何额外条款或条件。
依赖
~220KB