# ruapu   Detect CPU ISA features with single-file
CPU | ✅ x86, x86-64 ✅ arm, aarch64 ✅ mips ✅ powerpc ✅ s390x ✅ loongarch ✅ risc-v ✅ openrisc | ```c #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"); // loop all supported features const char* const* supported = ruapu_rua(); while (*supported) { fprintf(stderr, "%s\n", *supported); supported++; } return 0; } ``` |
OS | ✅ Windows ✅ Linux ✅ macOS ✅ Android ✅ iOS ✅ FreeBSD ✅ NetBSD ✅ OpenBSD ✅ DragonflyBSD ✅ Solaris ✅ SyterKit | |
Compiler | ✅ GCC ✅ Clang ✅ MSVC ✅ MinGW |
Compile ruapu test program ```shell # GCC / MinGW gcc main.c -o ruapu ``` ```shell # Clang clang main.c -o ruapu ``` ```shell # MSVC cl.exe /Fe: ruapu.exe main.c ``` | Run ruapu in command line ```shell ./ruapu mmx = 1 sse = 1 sse2 = 1 sse3 = 1 ssse3 = 1 sse41 = 1 sse42 = 1 sse4a = 1 xop = 0 ... more lines omitted ... ``` |
Compile and install ruapu library ```shell # from pypi pip3 install ruapu ``` ```shell # from source code pip3 install ./python ``` | Use ruapu in python ```python import ruapu ruapu.supports("avx2") # True ruapu.supports(isa="avx2") # True ruapu.rua() #(mmx', 'sse', 'sse2', 'sse3', 'ssse3', 'sse41', 'sse42', 'avx', 'f16c', 'fma', 'avx2') ``` |
Compile ruapu library ```shell # from source code cd rust cargo build --release ``` | Use ruapu in Rust ```rust extern crate ruapu; fn main() { println!("supports neon: {}", ruapu::supports("neon").unwrap()); println!("supports avx2: {}", ruapu::supports("avx2").unwrap()); println!("rua: {:?}", ruapu::rua()); } ``` |
Compile ruapu library ```shell # from source code cd lua # lua binding has been tested on Lua 5.2~5.4 luarocks make ``` | Use ruapu in Lua ```Lua ruapu = require "ruapu"; print(ruapu.supports("mmx")); for _, ext in ipairs(ruapu.rua()) do print(ext); end ``` |
Compile ruapu library ```erlang % add this to deps list % in your rebar.config {ruapu, "0.1.0"} ``` | Use ruapu in Erlang `rebar3 shell` ```erlang ruapu:rua(). {ok,["neon","vfpv4","asimdrdm","asimdhp","asimddp", "asimdfhm","bf16","i8mm","pmull","crc32","aes","sha1", "sha2","sha3","sha512","amx"]} > ruapu:supports("neon"). true > ruapu:supports(neon). true > ruapu:supports(<<"neon">>). true > ruapu:supports("avx2"). false > ruapu:supports(avx2). false > ruapu:supports(<<"avx2">>). false ``` |
Compile ruapu library ```shell # from source code cd fortran cmake -B build cmake --build build ``` | Use ruapu in Fortran ```fortran program main use ruapu, only: ruapu_init, ruapu_supports, ruapu_rua implicit none character(len=:), allocatable :: isa_supported(:) integer :: i call ruapu_init() print *, "supports sse: ", ruapu_supports("sse") print *, "supports neon: ", ruapu_supports("neon") isa_supported = ruapu_rua() do i = 1, size(isa_supported) print *, trim(isa_supported(i)) end do end program main ``` |
Compile ruapu library ```shell cd go go build -o ruapu-go ``` | Use ruapu in Golang ```go package main import ( "fmt" "ruapu-go/ruapu" "strconv" ) func main() { ruapu.Init() avx2Status := ruapu.Supports("avx2") fmt.Println("avx2:" + strconv.Itoa(avx2Status)) rua := ruapu.Rua() fmt.Println(rua) } ``` |
Add ruapu library to your project `haskell/Ruapu.hs`, `haskell/ruapu.c` and `ruapu.h` should be copied in your project. | Use ruapu in Haskell ```haskell import Ruapu -- Ruapu.rua :: IO [String] -- Ruapu.supports :: String -> IO Bool main = do Ruapu.init Ruapu.supports "mmx" >>= putStrLn . show Ruapu.rua >>= sequence_ . map putStrLn ``` |
Compile ruapu library ```shell cd vlang v . ``` | Use ruapu in Vlang ```go module main import ruapu fn main() { ruapu.ruapu_init() mut avx2_status := ruapu.ruapu_supports('avx2') if avx2_status { println('avx2: ' + avx2_status.str()) } println(ruapu.ruapu_rua()) } ``` |
Compile ruapu library ```shell cd pascal sudo apt install fpc cmake . make fpc ruapu.lpr ``` | Use ruapu in Pascal ```pascal program ruapu; uses ruapu_pascal; var has_avx2: integer; supported: PPAnsiChar; begin // initialize ruapu once ruapu_init(); // now, tell me if this cpu has avx2 has_avx2 := ruapu_supports('avx2'); // loop all supported features supported := ruapu_rua(); while supported^ <> nil do begin writeln(supported^); inc(supported); end; readln(); end. ``` |
Compile ruapu library and example ```shell ./gradlew build ``` Run example ```shell java -cp \ ./build/libs/ruapu-1.0-SNAPSHOT.jar \ ./Example.java ``` | Use ruapu in Java ```java import ruapu.Ruapu; import java.util.*; class Example { public static void main(String args[]) { Ruapu ruapu = new Ruapu(); System.out.println("avx: " + ruapu.supports("avx")); // avx: 1 System.out.println(Arrays.toString(ruapu.rua())); // [mmx, sse, sse2, sse3, ssse3, sse41, sse42, avx, f16c, fma, avx2] } } ``` |
Compile ruapu library ```bash cd cangjie cd c-src cmake . make ``` run example ```bash cd cangjie cjpm run ``` or compile example ```bash cd cangjie cjpm build ./target/release/bin/main ``` | Use ruapu in cangjie ```swift import ruapu.* main(): Int64 { ruapu_init() let neon_supported = ruapu_supports("neon") println("supports neon: ${neon_supported}") let d = ruapu_rua() for (i in d) { println(i) } return 0 } ``` |