Funkcje związane z procesorem

Istnieje kilka sposobów sprawdzania funkcji procesora w kodzie, z których każdy ma inne zalety i wady.

ABI: używanie wstępnie zdefiniowanych makr preprocesora

Zwykle najwygodniej jest określić ABI w czasie kompilacji za pomocą #ifdef w połączeniu z:

  • __arm__ w przypadku 32-bitowej architektury ARM;
  • __aarch64__ w przypadku 64-bitowych procesorów ARM;
  • __i386__ w przypadku 32-bitowego procesora X86;
  • __x86_64__ w przypadku 64-bitowej architektury X86

Pamiętaj, że 32-bitowa architektura X86 jest oznaczona jako __i386__, a nie __x86__, jak można by się spodziewać.

Liczba rdzeni procesora: użyj funkcji sysconf(3) z biblioteki libc

Funkcja sysconf(3) umożliwia sprawdzanie zarówno wartości _SC_NPROCESSORS_CONF (liczby rdzeni procesora w systemie), jak i _SC_NPROCESSORS_ONLN (liczby rdzeni procesora aktualnie online).

Funkcje: używanie funkcji getauxval(3) z biblioteki libc

W przypadku interfejsu API na poziomie 18 i nowszych funkcja getauxval(3) jest dostępna w bibliotece C Androida. Argumenty AT_HWCAPAT_HWCAP2 zwracają maski bitowe zawierające listę funkcji specyficznych dla procesora. W różnych hwcap.hnagłówkach NDK znajdziesz stałe, z którymi możesz porównywać wartości, np. HWCAP_SHA512 instrukcje SHA512 dla arm64 lub HWCAP_IDIVTinstrukcje dzielenia liczb całkowitych Thumb dla arm.

Biblioteka Google cpu_features

Jednym z problemów z AT_HWCAP jest to, że czasami urządzenia są mylone. Niektóre starsze urządzenia na przykład twierdzą, że mają instrukcje dzielenia całkowitego, ale ich nie mają.

Biblioteka cpu_features Google rozwiązuje takie problemy, wykorzystując własną wiedzę o konkretnych układach SoC (analizując /proc/cpuinfo, aby określić, o który układ SoC chodzi).

Ta biblioteka jest utrzymywana na potrzeby zespołów Google zajmujących się aplikacjami własnymi i zawiera obejścia wszystkich problematycznych urządzeń, z którymi się spotkali.

Biblioteka NDK cpufeatures (wycofana)

NDK nadal udostępnia przestarzałą bibliotekę o nazwie cpufeatures, aby zapewnić zgodność kodu źródłowego z aplikacjami, które już jej używają. W przeciwieństwie do nowszej i bardziej kompletnej biblioteki cpu_features ta starsza biblioteka nie zawiera obejść dla tak wielu konkretnych układów SoC.