Skip to main content

The Python binding of ruapu.

Project description

ruapu

GitHub License GitHub Actions Workflow Status

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

  1. Create one ruapu.c for your project
  2. ruapu.c is ONLY #define RUAPU_IMPLEMENTATION and #include "ruapu.h"
  3. 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 correctlymacOS hides it in cpuid
  • Detect new CPU's ISA on old systemsthey are usually not exposed in auxv or MISA
  • 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

  1. Add RUAPU_INSTCODE(rua, rua-inst-hex) // rua r0,r0 and RUAPU_ISAENTRY(rua) in ruapu.h
  2. Add PRINT_ISA_SUPPORT(rua) in main.c to print the detection result
  3. Add entries about rua in README.md
  4. Create a pull request!

https://godbolt.org/ is a good helper to view the compiled binary code of instructions.

Repos that use ruapu

  • ncnnHigh-performance neural network inference framework
  • libllmEfficient inference of large language models

Credits

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

ruapu-0.1.0-cp36-abi3-win_arm64.whl (9.6 kB view details)

Uploaded CPython 3.6+ Windows ARM64

ruapu-0.1.0-cp36-abi3-win_amd64.whl (10.8 kB view details)

Uploaded CPython 3.6+ Windows x86-64

ruapu-0.1.0-cp36-abi3-win32.whl (10.2 kB view details)

Uploaded CPython 3.6+ Windows x86

ruapu-0.1.0-cp36-abi3-musllinux_1_1_x86_64.whl (22.4 kB view details)

Uploaded CPython 3.6+ musllinux: musl 1.1+ x86-64

ruapu-0.1.0-cp36-abi3-musllinux_1_1_s390x.whl (20.4 kB view details)

Uploaded CPython 3.6+ musllinux: musl 1.1+ s390x

ruapu-0.1.0-cp36-abi3-musllinux_1_1_ppc64le.whl (21.8 kB view details)

Uploaded CPython 3.6+ musllinux: musl 1.1+ ppc64le

ruapu-0.1.0-cp36-abi3-musllinux_1_1_i686.whl (22.3 kB view details)

Uploaded CPython 3.6+ musllinux: musl 1.1+ i686

ruapu-0.1.0-cp36-abi3-musllinux_1_1_aarch64.whl (22.6 kB view details)

Uploaded CPython 3.6+ musllinux: musl 1.1+ ARM64

ruapu-0.1.0-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (15.2 kB view details)

Uploaded CPython 3.6+ manylinux: glibc 2.17+ s390x

ruapu-0.1.0-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (16.2 kB view details)

Uploaded CPython 3.6+ manylinux: glibc 2.17+ ppc64le

ruapu-0.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (17.6 kB view details)

Uploaded CPython 3.6+ manylinux: glibc 2.17+ ARM64

ruapu-0.1.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.0 kB view details)

Uploaded CPython 3.6+ manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

ruapu-0.1.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (16.6 kB view details)

Uploaded CPython 3.6+ manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

ruapu-0.1.0-cp36-abi3-macosx_11_0_arm64.whl (9.0 kB view details)

Uploaded CPython 3.6+ macOS 11.0+ ARM64

ruapu-0.1.0-cp36-abi3-macosx_10_9_x86_64.whl (8.8 kB view details)

Uploaded CPython 3.6+ macOS 10.9+ x86-64

ruapu-0.1.0-cp36-abi3-macosx_10_9_universal2.whl (12.6 kB view details)

Uploaded CPython 3.6+ macOS 10.9+ universal2 (ARM64, x86-64)

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

Hashes for ruapu-0.1.0-cp36-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 d1458ac3e309d90af344d3c5cc2fa1de3fa8e5caeb603a09193e96fa4ceea336
MD5 07a0353ba75d6fb911404ef123ef76ee
BLAKE2b-256 074cf595bdd30218fed3f63066b194806aa0380612107c36b61e4688aaa1bc79

See more details on using hashes here.

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

Hashes for ruapu-0.1.0-cp36-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 96a8a914807429bf396e1c7bd0382ff703fe1e47e362e63e4dddd68a72131bf9
MD5 28f648f01b9f8da6e87faf673789db27
BLAKE2b-256 c5482d0bb9afa8001b4492fc11cc94dca6e0fea3a721d66a58055c7a47431f8c

See more details on using hashes here.

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

Hashes for ruapu-0.1.0-cp36-abi3-win32.whl
Algorithm Hash digest
SHA256 f0880ca27678d3bc4e96f3d725b3de2756e98e96299a48abecd368f4eccec80d
MD5 970e858b2f986bc9cfde458784255745
BLAKE2b-256 2ce07f8f8c2a31e698ac06dda4ad5ab88094353ec625dfd4a07d4f4e01450eee

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 409ed34c6f47698638ce41f8f75697561492ba664c8e34597849262575beec27
MD5 ca1b43da77b78e14563bae76453602a6
BLAKE2b-256 b5dc187f499b4569c0a0ae6f53fae456bb2fae0b675338ddb907034b43b8efec

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 b1f51937e27856c9edf358a355479228c652574f98301ce366ac8d66350d6705
MD5 ee28a6a36ef6120434caeca731e1725c
BLAKE2b-256 b9ad1ba644dbd447609c87520f0412ef7b69baf2a7b8f68c6a12c3666a74edcf

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 d5d8b8cb5244bbb766553cfdd9cbff9b4a1079fefbd55eb25149c5f1826dbd14
MD5 b07c0c67f38a0ee1c8cb1be0480d4e85
BLAKE2b-256 27cfffd0b3b41934f8eea2ab0ac4982fb2e2859a77c1fb8cac0e2e6ee381ad3c

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 7f4c27fed93281db8647b0c4b29adaa39a4dc7d341eb38f9bd096b0fedf8bf76
MD5 508f0b91675bdf21d183c72c2642f83e
BLAKE2b-256 1988d39c8f561d184f295b8045373528136e4c622b2018380523bc1255db4afe

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1e431811c6f554c4705bb1f254ab808ad3dbf474f0da1b87116edbc78c05e216
MD5 ddc30a1413ce45752ec70da90614f43a
BLAKE2b-256 6fbcec4bf4ba14689e901b48c3c96cf41a19d4a1d9e24c276b3ef7a16e20c626

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 dfeda29a9905b08cda9fb4a76368bc961de0f5f3c9460a49c0e564a520aa3bdc
MD5 90b5efbdcd9b8682a9a7d0ff13f8b456
BLAKE2b-256 e178ec093a9859cf0a0f3ff8187304fa0c2fc47e639555a9f35b3c29581f246a

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 ca101cb0af355dda218aa709f1820581b6f07f64cc35657b325f37a984623530
MD5 f2ab33fd544342a2c3cf0563c8973e2f
BLAKE2b-256 16acf10a963e33c3dd01f8fad4407bc1fe943276d7405ab3c86868e221273f6b

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 89fb7ee471f9be1377604a97106572cf71f39bc034dbd7969d25883eb109d5eb
MD5 69c36fee82b8062470bf9e0051b83913
BLAKE2b-256 f6479ef0870433b8965d99d5ff8e3864a88d8088c63e3f75ffc312993f203462

See more details on using hashes here.

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

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d6c7b049a6a5bb4f628e991e5ac0692521612a42d19927bf22c8e18cd6bf31a5
MD5 c72b0f955340d4d464a023f47a7638f3
BLAKE2b-256 52bc1d1432d574b8623ffe3ff373ed5f0418abbbd4c1e72c6cbb0783731abe49

See more details on using hashes here.

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

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 632c9bb95d0cac99d693bca6f942fad67f9a35e6c9175753975ed6014ced1ac7
MD5 7b6742424d68102cf9d56c0cc8854e4e
BLAKE2b-256 24e63bf5ce6067e749c8ed54c033dfdc28d8a556d76911b5773730c0eda0b69f

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a88f83c20db11d18fc2777b89017975d4ba6dbf15b78ab64d8a898f72f7c2dd5
MD5 85b5075df39f06a3e43a6809bc86824a
BLAKE2b-256 b32e89459226351363f4d3c1066fd6eb1b5d3b55fc8cad3fd96bbefcae3607dd

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 50720a2aa154d2540dca4a8af8dc852acb5bd9f88e54739922746b52c3c35032
MD5 95caafe918cb3a55666d1258b005d47b
BLAKE2b-256 84de66f211382e3631566cd14a5482dc4c0375f1254b2b7e20ed373b3fadc233

See more details on using hashes here.

File details

Details for the file ruapu-0.1.0-cp36-abi3-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ruapu-0.1.0-cp36-abi3-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 529d6f173f96a28e3ef86fde57c3cd3403146d484eeebd300c84333eaa330c46
MD5 03c01210e256bd4757dee6e3bba83b70
BLAKE2b-256 3a0c2ba98716719465deb92617cd07d066e5df48150384650c05950b4133b2db

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page