android android-ndk jni jpeg libjpeg-turbo

¿Qué porcentaje de dispositivos Android se beneficia de las optimizaciones de Libjpeg-turbo?



android-ndk jni (3)

La gran mayoría de los dispositivos Android en el mercado usan un poco de CPU ARM. Los teléfonos de gama alta (por ejemplo, HTC Sensation) tienden a utilizar CPU ARM que son compatibles con NEON (Qualcomm Snapdragon, OMAP4, Samsung Exynos, Tegra3). Los teléfonos más antiguos / menos capacitados generalmente tienen algún conjunto de chips ARMv6 como la serie Qualcomm MSM72xx. Algunos buenos ejemplos son el Google G1 y el Motorola Droid original.

Las tabletas Android son una historia ligeramente diferente. Un gran porcentaje de los dispositivos de tableta existentes se basan en el chipset nVidia Tegra2 que no incluye soporte de NEON. Las tabletas más nuevas basadas en Tegra3 (Asus Transformer Prime) incluyen soporte para NEON. Algunas tabletas raras se basan en el SOC de Qualcomm (por ejemplo, HTC Flyer) y también son compatibles con NEON. También hay algunas tabletas de bajo costo basadas en MIPS e incluso algunas con chips x86. Luego está la categoría relativamente nueva de dispositivos Google-TV. Durante el año pasado, estos han sido principalmente x86, pero la última generación próximamente tendrá muchos que usan CPU ARM.

El proyecto libjpeg-turbo "usa instrucciones SIMD (MMX, SSE2, NEON) para acelerar la compresión y descompresión JPEG de línea de base en los sistemas x86, x86-64 y ARM".

¿Qué tipo de acción del espacio del dispositivo Android admite estas instrucciones y, por lo tanto, obtendría un beneficio de velocidad al usar esta biblioteca?

(Voy a descomprimir jpegs en código nativo al que se accede a través de NDK).


para el puerto libjpeg-turbo que hice (y todavía estoy trabajando) hay las siguientes cosas a considerar:

conjunto de instrucciones (armv6, armv7), SIMD (con o sin NEON)

Libjpeg-turbo realmente brilla en armv7 con NEON. NEON es el soporte SIMD del brazo.

Tegra, Tegra2 no tiene NEON pero es armv7, por ejemplo. Entonces, libjpeg-turbo se puede construir ahora mismo, desactivando el soporte de NEON pero aún usando algunas de las optimizaciones de armv7 ... simplemente no será tan rápido. Todavía será más rápido que el libjpeg que se encuentra actualmente en Android.

Hay chips de armv6 por ahí en teléfonos nuevos con Android. Especialmente para los mercados más baratos. En lugar de entrar en una lista exhaustiva, lo que debe suceder en la lib (y este es el tipo de WIP para mí actualmente) es obtener varias optimizaciones de armv6 en libjpeg-turbo, así que hay una buena historia para libjpeg-turbo en Android. Manténganse al tanto.


Actualmente, todos los dispositivos Android usan el conjunto de instrucciones ARM. Y la mayoría de ellos (pero no todos) admite el conjunto de instrucciones NEON. Las instrucciones de NEON son como SSE2 a x86.