Istnieje kilka sposobów na sprawdzenie w kodzie funkcji procesora. Każdy z nich wiąże się z innym zestawem wad.
ABI: użyj wstępnie zdefiniowanych makr wstępnie procesora
Zwykle najlepiej jest określić interfejs ABI na etapie kompilacji za pomocą parametru #ifdef
w połączeniu z:
__arm__
dla 32-bitowej ARM__aarch64__
dla 64-bitowej procesora ARM__i386__
dla 32-bitowej wersji X86__x86_64__
dla 64-bitowej wersji X86
Pamiętaj, że 32-bitowy kod X86 nosi nazwę __i386__
, a nie __x86__
.
Liczba rdzeni procesora: użyj pliku sysconf(3) biblioteki libc
sysconf(3) pozwala na wysyłanie zapytań o _SC_NPROCESSORS_CONF
(liczbę rdzeni procesora w systemie) i _SC_NPROCESSORS_ONLN
(liczbę rdzeni procesora obecnie online).
Funkcje: użyj polecenia getauxval(3) biblioteki libc
W interfejsie API na poziomie 18 lub nowszym funkcja getauxval(3) jest dostępna w bibliotece C Androida. Argumenty AT_HWCAP
i AT_HWCAP2
zwracają maski bitowe z listą funkcji związanych z CPU. Sprawdź różne nagłówki parametru hwcap.h
w pakiecie NDK, z którymi chcesz porównywać stałe, np. HWCAP_SHA512
– instrukcje dotyczące algorytmu SHA512 w grupie eksperymentalnej i HWCAP_IDIVT
w przypadku instrukcji dzielenia liczby całkowitej kciuka.
Biblioteka Google cpu_features
Jednym z problemów z usługą AT_HWCAP
jest to, że czasami urządzenia się mylą. Niektóre stare urządzenia, na przykład, podają się jako instrukcję dzielenia liczb całkowitych, ale nie mają.
Biblioteka cpu_features Google eliminuje takie problemy, stosując własną wiedzę o konkretnych układach scalonych (analiza /proc/cpuinfo
w celu znalezienia konkretnego SOC).
Ta biblioteka jest udostępniana do użytku przez zespoły Google ds. aplikacji własnych i zawiera obejścia wszystkich problemów, które napotkali oni w środowisku Google.
Biblioteka procesorów NDK (wycofana)
Pakiet NDK nadal zawiera wycofaną bibliotekę o nazwie cpufeatures
, która zapewnia zgodność źródła z aplikacjami, które już z niej korzystają. W przeciwieństwie do nowszej i bardziej kompletnej biblioteki cpu_features ta biblioteka historyczna nie ma obejścia dla tak wielu konkretnych układów SOC.