The Python binding of ruapu.
Project description
ruapu
Detect CPU ISA features with single-file
CPU | ✅ x86, x86-64 ✅ arm, aarch64 ✅ mips ✅ powerpc ✅ s390x ✅ loongarch ✅ risc-v ✅ openrisc |
#define RUAPU_IMPLEMENTATION
#include "ruapu.h"
int main()
{
// initialize ruapu once
ruapu_init();
// now, tell me if this cpu has avx2
int has_avx2 = ruapu_supports("avx2");
return 0;
}
|
OS | ✅ Windows ✅ Linux ✅ macOS ✅ Android ✅ iOS ✅ FreeBSD ✅ NetBSD ✅ OpenBSD | |
Compiler | ✅ GCC ✅ Clang ✅ MSVC ✅ MinGW |
Best practice for using ruapu.h
in multiple compilation units
- Create one
ruapu.c
for your project ruapu.c
is ONLY#define RUAPU_IMPLEMENTATION
and#include "ruapu.h"
- Other sources
#include "ruapu.h"
but NO#define RUAPU_IMPLEMENTATION
Let's ruapu
ruapu with C
Compile ruapu test program # GCC / MinGW
gcc main.c -o ruapu
# Clang
clang main.c -o ruapu
# MSVC
cl.exe /Fe: ruapu.exe main.c
|
Run ruapu in command line ./ruapu
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 1
xop = 0
... more lines omitted ...
|
ruapu with Python
Compile and install ruapu library # from source code
pip3 install .
|
Use ruapu in python import ruapu
ruapu.supports("avx2")
# True
ruapu.supports(isa="avx2")
# True
|
Github-hosted runner result (Linux)
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 1
xop = 0
avx = 1
f16c = 1
fma = 1
avx2 = 1
avx512f = 0
avx512bw = 0
avx512cd = 0
avx512dq = 0
avx512vl = 0
avx512vnni = 0
avx512bf16 = 0
avx512ifma = 0
avx512vbmi = 0
avx512vbmi2 = 0
avx512fp16 = 0
avxvnni = 0
avxvnniint8 = 0
avxifma = 0
Github-hosted runner result (macOS)
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 0
xop = 0
avx = 1
f16c = 1
fma = 1
avx2 = 1
avx512f = 0
avx512bw = 0
avx512cd = 0
avx512dq = 0
avx512vl = 0
avx512vnni = 0
avx512bf16 = 0
avx512ifma = 0
avx512vbmi = 0
avx512vbmi2 = 0
avx512fp16 = 0
avxvnni = 0
avxvnniint8 = 0
avxifma = 0
Github-hosted runner result (macOS M1)
neon = 1
vfpv4 = 1
cpuid = 0
asimdhp = 1
asimddp = 1
asimdfhm = 1
bf16 = 0
i8mm = 0
sve = 0
sve2 = 0
svebf16 = 0
svei8mm = 0
svef32mm = 0
Github-hosted runner result (Windows)
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 1
xop = 0
avx = 1
f16c = 1
fma = 1
avx2 = 1
avx512f = 0
avx512bw = 0
avx512cd = 0
avx512dq = 0
avx512vl = 0
avx512vnni = 0
avx512bf16 = 0
avx512ifma = 0
avx512vbmi = 0
avx512vbmi2 = 0
avx512fp16 = 0
avxvnni = 0
avxvnniint8 = 0
avxifma = 0
FreeBSD/NetBSD/OpenBSD VM result (x86_64)
mmx = 1
sse = 1
sse2 = 1
sse3 = 1
ssse3 = 1
sse41 = 1
sse42 = 1
sse4a = 1
xop = 0
avx = 1
f16c = 1
fma = 1
fma4 = 0
avx2 = 1
avx512f = 0
avx512bw = 0
avx512cd = 0
avx512dq = 0
avx512vl = 0
avx512vnni = 0
avx512bf16 = 0
avx512ifma = 0
avx512vbmi = 0
avx512vbmi2 = 0
avx512fp16 = 0
avxvnni = 0
avxvnniint8 = 0
avxifma = 0
Features
- Detect CPU ISA with single-file
sse2
,avx
,avx512f
,neon
, etc. - Detect vendor extended ISA
apple
amx
, risc-v vendor ISA, etc. - Detect richer ISA on Windows ARM
IsProcessorFeaturePresent()
returns little ISA information - Detect
x86-avx512
on macOS correctly macOS hides it incpuid
- Detect new CPU's ISA on old systems
they are usually not exposed in
auxv
orMISA
- Detect CPU hidden ISA
fma4
on zen1, ISA in hypervisor, etc.
Supported ISA (more is comming ... :)
CPU | ISA |
---|---|
x86 | mmx sse sse2 sse3 ssse3 sse41 sse42 sse4a xop avx f16c fma fma4 avx2 avx512f avx512bw avx512cd avx512dq avx512vl avx512vnni avx512bf16 avx512ifma avx512vbmi avx512vbmi2 avx512fp16 avxvnni avxvnniint8 avxifma |
arm | edsp neon vfpv4 idiv |
aarch64 | neon vfpv4 cpuid asimdrdm asimdhp asimddp asimdfhm bf16 i8mm mte sve sve2 svebf16 svei8mm svef32mm pmull crc32 aes sha1 sha2 sha3 sha512 sm3 sm4 amx |
mips | msa |
powerpc | vsx |
s390x | zvector |
loongarch | lsx lasx |
risc-v | i m a f d c zfa zfh zfhmin zicsr zifencei zmmul |
openrisc | orbis32 orbis64 orfpx32 orfpx64 orvdx64 |
Techniques inside ruapu
ruapu is implemented in C language to ensure the widest possible portability.
ruapu determines whether the CPU supports certain instruction sets by trying to execute instructions and detecting whether an Illegal Instruction
exception occurs. ruapu does not rely on the cpuid instructions and registers related to the CPU architecture, nor does it rely on the MISA
information and system calls of the operating system. This can help us get more detailed CPU ISA information.
FAQ
Why is the project named ruapu
ruapu is the abbreviation of rua-cpu, which means using various extended instructions to harass and amuse the CPU (rua!). Based on whether the CPU reacts violently (throws an illegal instruction exception), it is inferred whether the CPU supports a certain extended instruction set.
Why is ruapu API designed like this
We consider gcc builtin functions to be good practice, saying __builtin_cpu_init()
and __builtin_cpu_supports()
. ruapu refers to this design, which can be a 1:1 replacement for gcc functions, and supports more operating systems and compilers, giving it better portability.
Why does SIGILL occur when executing in debugger or simulator, such as gdb
, lldb
, qemu-user
, sde
etc.
Because debuggers and simulators capture the signal and stop the ruapu signal handler function by default, we can continue execution at this time, or configure it specifically, such as handle SIGILL nostop
in gdb. ruapu technically cannot prevent programs from stopping in debuggers and emulators
How to add detection capabilities for new instructions to ruapu
Assume that the new extended instruction set is named rua
- Add
RUAPU_INSTCODE(rua, rua-inst-hex) // rua r0,r0
andRUAPU_ISAENTRY(rua)
inruapu.h
- Add
PRINT_ISA_SUPPORT(rua)
inmain.c
to print the detection result - Add entries about
rua
in README.md - Create a pull request!
https://godbolt.org/ is a good helper to view the compiled binary code of instructions.
Repos that use ruapu
- ncnn High-performance neural network inference framework
- libllm Efficient inference of large language models
Credits
- @nihui Write the initial POC code and ruapu maintainer
- @kernelbin Implement exception handling for Windows
- @zchrissirhcz Detect x86 FMA4
- @MollySophia Fix C++ export symbol
- @strongtz Detect more aarch64 ISA
- @monkeyking Detect apple arm64 AMX
- @junchao-loongson Add loongarch support
- @ziyao233 Detect more risc-v ISA
- @dreamcmi Detect more risc-v ISA
- @cocoa-xu Add FreeBSD support, python support
- @YuzukiTsuru Add OpenRISC support
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
File details
Details for the file ruapu-0.1.0-cp36-abi3-win_arm64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-win_arm64.whl
- Upload date:
- Size: 9.6 kB
- Tags: CPython 3.6+, Windows ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d1458ac3e309d90af344d3c5cc2fa1de3fa8e5caeb603a09193e96fa4ceea336 |
|
MD5 | 07a0353ba75d6fb911404ef123ef76ee |
|
BLAKE2b-256 | 074cf595bdd30218fed3f63066b194806aa0380612107c36b61e4688aaa1bc79 |
File details
Details for the file ruapu-0.1.0-cp36-abi3-win_amd64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-win_amd64.whl
- Upload date:
- Size: 10.8 kB
- Tags: CPython 3.6+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 96a8a914807429bf396e1c7bd0382ff703fe1e47e362e63e4dddd68a72131bf9 |
|
MD5 | 28f648f01b9f8da6e87faf673789db27 |
|
BLAKE2b-256 | c5482d0bb9afa8001b4492fc11cc94dca6e0fea3a721d66a58055c7a47431f8c |
File details
Details for the file ruapu-0.1.0-cp36-abi3-win32.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-win32.whl
- Upload date:
- Size: 10.2 kB
- Tags: CPython 3.6+, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f0880ca27678d3bc4e96f3d725b3de2756e98e96299a48abecd368f4eccec80d |
|
MD5 | 970e858b2f986bc9cfde458784255745 |
|
BLAKE2b-256 | 2ce07f8f8c2a31e698ac06dda4ad5ab88094353ec625dfd4a07d4f4e01450eee |
File details
Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_x86_64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-musllinux_1_1_x86_64.whl
- Upload date:
- Size: 22.4 kB
- Tags: CPython 3.6+, musllinux: musl 1.1+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 409ed34c6f47698638ce41f8f75697561492ba664c8e34597849262575beec27 |
|
MD5 | ca1b43da77b78e14563bae76453602a6 |
|
BLAKE2b-256 | b5dc187f499b4569c0a0ae6f53fae456bb2fae0b675338ddb907034b43b8efec |
File details
Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_s390x.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-musllinux_1_1_s390x.whl
- Upload date:
- Size: 20.4 kB
- Tags: CPython 3.6+, musllinux: musl 1.1+ s390x
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1f51937e27856c9edf358a355479228c652574f98301ce366ac8d66350d6705 |
|
MD5 | ee28a6a36ef6120434caeca731e1725c |
|
BLAKE2b-256 | b9ad1ba644dbd447609c87520f0412ef7b69baf2a7b8f68c6a12c3666a74edcf |
File details
Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_ppc64le.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-musllinux_1_1_ppc64le.whl
- Upload date:
- Size: 21.8 kB
- Tags: CPython 3.6+, musllinux: musl 1.1+ ppc64le
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d5d8b8cb5244bbb766553cfdd9cbff9b4a1079fefbd55eb25149c5f1826dbd14 |
|
MD5 | b07c0c67f38a0ee1c8cb1be0480d4e85 |
|
BLAKE2b-256 | 27cfffd0b3b41934f8eea2ab0ac4982fb2e2859a77c1fb8cac0e2e6ee381ad3c |
File details
Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_i686.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-musllinux_1_1_i686.whl
- Upload date:
- Size: 22.3 kB
- Tags: CPython 3.6+, musllinux: musl 1.1+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f4c27fed93281db8647b0c4b29adaa39a4dc7d341eb38f9bd096b0fedf8bf76 |
|
MD5 | 508f0b91675bdf21d183c72c2642f83e |
|
BLAKE2b-256 | 1988d39c8f561d184f295b8045373528136e4c622b2018380523bc1255db4afe |
File details
Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_aarch64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-musllinux_1_1_aarch64.whl
- Upload date:
- Size: 22.6 kB
- Tags: CPython 3.6+, musllinux: musl 1.1+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1e431811c6f554c4705bb1f254ab808ad3dbf474f0da1b87116edbc78c05e216 |
|
MD5 | ddc30a1413ce45752ec70da90614f43a |
|
BLAKE2b-256 | 6fbcec4bf4ba14689e901b48c3c96cf41a19d4a1d9e24c276b3ef7a16e20c626 |
File details
Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
- Upload date:
- Size: 15.2 kB
- Tags: CPython 3.6+, manylinux: glibc 2.17+ s390x
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | dfeda29a9905b08cda9fb4a76368bc961de0f5f3c9460a49c0e564a520aa3bdc |
|
MD5 | 90b5efbdcd9b8682a9a7d0ff13f8b456 |
|
BLAKE2b-256 | e178ec093a9859cf0a0f3ff8187304fa0c2fc47e639555a9f35b3c29581f246a |
File details
Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
- Upload date:
- Size: 16.2 kB
- Tags: CPython 3.6+, manylinux: glibc 2.17+ ppc64le
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca101cb0af355dda218aa709f1820581b6f07f64cc35657b325f37a984623530 |
|
MD5 | f2ab33fd544342a2c3cf0563c8973e2f |
|
BLAKE2b-256 | 16acf10a963e33c3dd01f8fad4407bc1fe943276d7405ab3c86868e221273f6b |
File details
Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 17.6 kB
- Tags: CPython 3.6+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89fb7ee471f9be1377604a97106572cf71f39bc034dbd7969d25883eb109d5eb |
|
MD5 | 69c36fee82b8062470bf9e0051b83913 |
|
BLAKE2b-256 | f6479ef0870433b8965d99d5ff8e3864a88d8088c63e3f75ffc312993f203462 |
File details
Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 17.0 kB
- Tags: CPython 3.6+, manylinux: glibc 2.17+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6c7b049a6a5bb4f628e991e5ac0692521612a42d19927bf22c8e18cd6bf31a5 |
|
MD5 | c72b0f955340d4d464a023f47a7638f3 |
|
BLAKE2b-256 | 52bc1d1432d574b8623ffe3ff373ed5f0418abbbd4c1e72c6cbb0783731abe49 |
File details
Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
- Upload date:
- Size: 16.6 kB
- Tags: CPython 3.6+, manylinux: glibc 2.17+ i686, manylinux: glibc 2.5+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 632c9bb95d0cac99d693bca6f942fad67f9a35e6c9175753975ed6014ced1ac7 |
|
MD5 | 7b6742424d68102cf9d56c0cc8854e4e |
|
BLAKE2b-256 | 24e63bf5ce6067e749c8ed54c033dfdc28d8a556d76911b5773730c0eda0b69f |
File details
Details for the file ruapu-0.1.0-cp36-abi3-macosx_11_0_arm64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 9.0 kB
- Tags: CPython 3.6+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a88f83c20db11d18fc2777b89017975d4ba6dbf15b78ab64d8a898f72f7c2dd5 |
|
MD5 | 85b5075df39f06a3e43a6809bc86824a |
|
BLAKE2b-256 | b32e89459226351363f4d3c1066fd6eb1b5d3b55fc8cad3fd96bbefcae3607dd |
File details
Details for the file ruapu-0.1.0-cp36-abi3-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-macosx_10_9_x86_64.whl
- Upload date:
- Size: 8.8 kB
- Tags: CPython 3.6+, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 50720a2aa154d2540dca4a8af8dc852acb5bd9f88e54739922746b52c3c35032 |
|
MD5 | 95caafe918cb3a55666d1258b005d47b |
|
BLAKE2b-256 | 84de66f211382e3631566cd14a5482dc4c0375f1254b2b7e20ed373b3fadc233 |
File details
Details for the file ruapu-0.1.0-cp36-abi3-macosx_10_9_universal2.whl
.
File metadata
- Download URL: ruapu-0.1.0-cp36-abi3-macosx_10_9_universal2.whl
- Upload date:
- Size: 12.6 kB
- Tags: CPython 3.6+, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 529d6f173f96a28e3ef86fde57c3cd3403146d484eeebd300c84333eaa330c46 |
|
MD5 | 03c01210e256bd4757dee6e3bba83b70 |
|
BLAKE2b-256 | 3a0c2ba98716719465deb92617cd07d066e5df48150384650c05950b4133b2db |