81 lines
1.9 KiB
Markdown
81 lines
1.9 KiB
Markdown
# ruapu
|
|
Detect cpu ISA features with single-file
|
|
|
|
<table>
|
|
<tr><td>CPU</td><td> ✅ x86, x86-64<br/>✅ arm, aarch64</td><td rowspan=3>
|
|
|
|
```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");
|
|
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
</td></tr>
|
|
<tr><td>OS</td><td>✅ Windows<br/>✅ Linux<br/>✅ macOS<br/>✅ Android<br/>✅ iOS</td></tr>
|
|
<tr><td>Compiler</td><td>✅ GCC<br/>✅ Clang<br/>✅ MSVC<br/>✅ MinGW</td></tr>
|
|
</table>
|
|
|
|
## Let's ruapu
|
|
|
|
<table>
|
|
|
|
<tr><td>
|
|
|
|
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
|
|
```
|
|
</td>
|
|
<td>
|
|
|
|
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 ...
|
|
```
|
|
|
|
</td></tr>
|
|
</table>
|
|
|
|
## 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.
|
|
|
|
- Detect vendor extended ISA, apple `amx`, risc-v vendor ISA, etc.
|
|
- Checking for richer isa on Windows ARM, `IsProcessorFeaturePresent()` can only get little ISA information
|
|
- Correctly detect `x86-avx512` for macOS, macOS hides it in `cpuid`
|
|
- Detect new cpu's ISA on older systems, they are usually not exposed in `auxv` or `MISA`
|
|
- Detect CPU hidden ISA, `x86-fma4` on zen1, ISA in hypervisor, etc.
|
|
|