CG & C++ blog
57 subscribers
13 photos
2 files
129 links
Краткий обзор публикаций, презентаций, докладов по графике и C++
Download Telegram
Как получить информацию о ЦП на Android.

Через /proc/cpuinfo можно узнать количество ядер и их описание.
processor - номер ядра.
CPU implementer - производитель ЦП (`ARM_CPU_IMP_*`).
CPU part - номер модели ЦП (`*_CPU_PART_*`).
Константы можно посмотреть здесь: arm cputype, arm64 cputype, julia/processor_arm.cpp - расширенный список, включает ЦП для IoT.

Features - список расширенных инструкций ЦП, расшифровка есть здесь: Arm CPU features table
То же самое можно получить через getauxval() с AT_HWCAP и AT_HWCAP2.

BogoMIPS - мера производительности, но часто выдает одинаковые значения для всех типов ядер.

Через /sys/devices/system/cpu/cpu[x] доступна дополнительная информация:
cpufreq/cpuinfo_min_freq, cpufreq/cpuinfo_max_freq - минимальная и максимальная частота ядра.
cpufreq/scaling_cur_freq - текущая частота ядра, используется как замена cpuinfo_cur_freq, который недоступен.

По максимальной частоте можно сгруппировать ядра по типу производительности:
* высокопроизводительные (X1, X2)
* производительные (A78)
* энергоэффективные (A55)
Либо через параметр /sys/devices/system/cpu/cpu[x]/cpu_capacity - чем он больше, тем производительнее ядро.
#blog #arm #cpu_prof
Как получить информацию о ЦП на Windows.

IsProcessorFeaturePresent - для проверки поддерживаемых инструкций типа SSE, то же самое возвращает и __cpuid().
GetSystemCpuSetInformation - возвращает подробную информацию о ЦП, например EfficiencyClass позволит обнаружить энергоэффективные ядра на новых Intel.
CallNtPowerInformation - с параметром ProcessorInformation позволяет получить частоту ядра ЦП, но параметр CurrentMhz не меняется.
GetLogicalProcessorInformationEx - с параметром RelationCache позволяет получить информацию о кэше, но часто информация неполная.

NtQuerySystemInformation - с параметром SystemProcessorPerformanceInformation позволяет получить значения счетчиков для каждого ядра, в WinAPI структуры определены без полей, но есть информация на сторонних ресурсах SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
Счетчики обновляются не так часто, при 100Гц дельта может быть 0, лучше обновлять каждую секунду. Так можно рассчитать % использования ЦП:

LONGLONG idle_time = next.IdleTime - prev.IdleTime;
LONGLONG kernel_time = next.KernelTime - prev.KernelTime;
LONGLONG user_time = next.UserTime - prev.UserTime;
LONGLONG total_time = idle_time + kernel_time + user_time;
float user_usage = float(user_time) / float(total_time);
float kernel_usage = float(kernel_time) / float(total_time);

С параметром SystemPerformanceInformation возвращается структура SYSTEM_PERFORMANCE_INFORMATION, где есть дополнительные счетчики производительности.
#blog #cpu_prof
Инструменты профилирования для Android.

Есть стандартные инструменты: Google AGI, Adreno GPU profiler, Mali profiler, но поддержка устройств ограничена и у меня ни один профайлер не стал работать с Vulkan.

Остается прямой доступ к счетчикам, для этого есть несколько библиотек:
HWCPipe - счетчики для ARM CPU и Mali GPU. Не поддерживается на Qualcomm CPU (Kryo) и некоторых ARM CPU, даже если в названии Cortex Axx. Пример использования можно посмотреть в Vulkan samples.

hardware-perfcounter - счетчики для Mali и Adreno, доступно намного больше счетчиков, в том числе специфичные для Adreno 5xx и 6xx.

Прямой доступ к счетчикам позволяет написать алгоритм для самооптимизации, когда идет переключение между разными алгоритмами, подгонка итераций/констант и тд.
#blog #gpu_prof #cpu_prof