View
128
Download
0
Category
Tags:
Preview:
DESCRIPTION
Slide del webinar Intel rivolte a tutti coloro che, avendo già una conoscenza base della programmazione NDK per Android, vogliono esplorare gli strumenti necessari per compilare codice nativo espressamente dedicato a dispositivi basati su processori Intel. E' affrontato il porting di codice c/c++ per dispositivi basati su architettura Intel originariamente creato su altre architetture. Sono presentati 3 casi d’uso, mostrando con livelli di difficoltà crescenti il processo completo di creazione di una semplice applicazione Android basata su NDK, confrontando i flag di compilazione necessari per ottimizzare un'applicazione Android basata su NDK affinché sia utilizzabile su dispositivi basati su architettura Intel.
Citation preview
Copyright(C) 2012 Intel Corporation. All rights reserved. *Other brands and names are properties of their respective owners.
#IntelAndroid
Massimiliano Torregiani #IntelAndroid
25/11/2014, webinar
Porting e ottimizzazione
di applicazioni NDK per
dispositivi Intel
Nice to Meet You!
Massimiliano TorregianiManager @ Kalpa srl
Intel Software Innovator
email: massimiliano.torregiani@kalpa.it
twitter: @maxtorregiani
linkedin: it.linkedin.com/pub/massimiliano.torregiani/
Android SDK e NDK
Programmazione SDK
compile once, run everywhere
Programmazione NDK
compile once, run everywhere
oppure oppure
Modello per applicazioni SDK / NDK
Intel’s Binary Translator (aka libhoudini)
Per compatibilità verso le migliaia di applicazioni basate su codice nativo compilate
esclusivamente per ARM, Intel ha progettaro un Binary Translator (BT) in grado di
eseguire le applicazioni Android con ARM nativo binari su dispositivi Intel Atom.
Intel e Google hanno lavorato insieme per
garantire l'esecuzione delle applicazioni native
su piattaforma Intel Atom per smartphone,
senza porting supplementare per gli
sviluppatori di applicazioni
• minimo overhead di potenza
• Impatto sulle prestazioni impercettibile per
molte applicazioni
libhoudin
i
Concetti di Xcompilazione nativa
Sistema Host
E’ il sistema dove il compilatore è installato e su cui avviene la compilazione
Sistema Target
E’ il sistema dove l’eseguibile generato su host sarà eseguito.
Cosa serve per la compilazione?
• Toolchain (compilatore, linker, archiver, assembler, etc)
• Header file delle librerie
• Librerie standard, dei framework e altre librerie accessorie cross-
compilate per il sistema target
Pacchetto NDK di Google
Il pacchetto NDK fornito da Google comprende:
Target Architecture
• ARMv5TE & ARMv7-A
• MIPS
• X86 - Intel Atom
Target operative system
Tipo e versione compilatore(e.g. GCC 4.8)
Supporto Intel per Android:
INDE & HAXMIntel INDE
• Tool pensato per aiutare i developer ad adattare le
proprie applicazioni a più architetture permettendo,
mediante un’unica interfaccia, di eseguire facilmente il
setup dell’ambiente di sviluppo includendo in maniera
automatica compilatori per le architetture ARM ed
x86. Il tool consente inoltre di sfruttare le potenzialità
di Intel HAXM per il debugging.
Intel HAXM
• Hypervisor che utilizza la tecnologia Intel VT-x per
migliorare la virtualizzazione dell’emulatore ed
aumentarne le prestazioni.
Porting di applicazini Android NDKLe applicazioni NDK possono essere divise in 3 tipi:
1) Codice nativo in C/C++ non legato all'hardware
• Ricompilare il codice nativo per eseguire l'applicazione su piattaforma Intel Atom
• Aprire il progetto NDK, cercare il file Android.mk e aggiungere "APP_ABI: =
armeabi armeabi-v7a x86” e ricompilare il codice nativo con ndk-build
• Per indirizzare su target Intel Atom aggiungere “APP_CFLAGS:=-
xATOM_SSSE3”
• Abilitare ottimizzazioni interproceduralli “APP_CFLAGS:=-xATOM_SSSE3 –ipo”
• Creare il package dell'applicazione con anche la piattaforma x86
2) Se il codice nativo utilizza una libreria dinamica di terze parti
• la shared lib deve essere ricompilata in versione x86 per piattaforma Intel
Atom
3) Se il codice nativo include del codice assembly fortemente legato a
piattaforme non-IA
Il codice deve essere riscritto con assembler IA o in C/C++
Porting da ARM a x86
Sample 1:
HelloJni
Differenze tra architettura ARM e X86
Memory Alignment
struct TestStruct {
int mVar1;
long long mVar2;
int mVar3;
};
By Default
“Double Margin”
By default
No margin
GCC flag “-malign-double”
Porting da ARM a x86
Sample 2:
HelloMemory
SIMD technology
Single Instruction, Multiple Data (SIMD) è un'architettura per
l’elaborazione di dati in parallelo, principalmente rivolta ad
elaborazioni multimediali. La tecnologia SIMD è utilizzata in vari
progetti Open Source:• Ottimizzazioni di Android
• Codec GSM AMR (Adaptive Multi-Rate)
• Bluez – stack ufficiale Bluetooth di linux
• ffmpeg – libavcodec
• Media player LGPL usati in molte
distribuzioni Linux
• Video: MPEG-2, MPEG-4ASP, H.264
(AVC), VC1
• Audio: Ogg Vorbis
• x264
GPL h.264 encoder – per video
SIMD technology: NEON di ARM
NEON è una tecnologia SIMD a 128 bit inclusa negli ARM della serie
Cortex–A, ovvero da ARMv7 in poi.
NEON poggia su un set di istruzioni separato, registri indipendenti,
esecuzione del codice separata e consente di gestire fino a 16 operazioni
contemporaneamente.
NEON gestisce dati a 8/16/32/64 bit di tipo intero, a singola precisione e in
virgola mobile.
SIMD technology: the Intel way
SSE è l’estensione Streaming SIMD per Intel Architecture (IA). I
processori Intel Atom attualmente supportano fino a SSSE3
(Supplemental Streaming SIMD Extensions 3).
SSE è anche un engine a
128 bit volto al packaging
dei dati in virgola mobile.
Intel Atom
Porting da NEON a SSE
Non esiste una diretta corrispondenza tra le istruzioni NEON e SSE.
Riservare un po’ di tempo, armarsi di pazienza e di un pizzico di fortuna.
Documentazione:
• NEON:
http://www.arm.com/products/processors/technologies/neon.php
https://software.intel.com/sites/default/files/m/b/4/c/DHT0002A_introducing_neon.pdf
• SSE:
• sezione “Volume 1: Basic Architecture" dei Software Developer Manuals di Intel:
http://www.intel.com/content/www/us/en/processors/architectures-software-
developer-manuals.html
• come cross-reference mnemonico per tutte le istruzioni SSE(x), siete incoraggiati a
guardare le carie istruzioni SSE a livello di gruppo che si trovano al link:
http://neilkemp.us/src/sse_tutorial/sse_tutorial.html
Principali differenze tra codice assembler
NEON e SSE
Endian-ness
Intel supporta solo assembler little-endian, mentre ARM supporta sia little che big
endian (ARM è bi-endian)
Granularità
Confrontando alcune istruzioni come la ADDPS per SSE con la VADD.ix per NEON
(es: x = 8 o 16), si nota che quest'ultimo propone diverse granularità di dati come
parte del suo riferimento mnemonico.
Differenze tra architettura ARM e X86
Memory
Alignment
Big or little endian order
(ARM is bi-endian)little-endian
assembly
Floating PointARMv5 Soft FP opts
ARMv7 Hardware FPU
instructions (VFP)
Intel Atom IA-32
instructions, Hardware
Based FP opts
SIMD
extensions
ARMv5 No SIMD ext
ARMv7 NEON ext
Intel Atom SSSE3
(Supplemental Streaming SIMD
Extensions 3)
Differenze tra architettura GCC Flags
Memory
Alignment
–mlittle-endian
–mbig-endian
Floating Point
SIMD
extensions
-mfloat-abi= soft | softfp | hard
-mfpu= vfp | vfpv3-d16 | neon | ...
–mfpmath=sse
-mavx
-maes
-march=armv7-a
-mtune=cortex-a8
–DHAVE_NEON=1
-msse
Riferimenti: http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86-64-Options.html
Sample 3: FIR algorithm
Finite Impulse Response (FIR), è una tipologia di filtro
digitale caratterizzata da una risposta impulsiva di durata
finita.
Porting da ARM a x86
Sample 3:
HelloNeon
to
HelloSSE
Benchmark: device under-test
Samsung Tab 3
Intel Atom Z2560
Dual Core / Quad
thread
1.6GHz
SIMD technology:
SSSE3, SSE3, SSE2
Cache: 1MB
Benchmark: results
0 200 400 600 800 1000 1200
C version (arm translation)
C version (x86)
C version (x86 & flags)
NEON translation
SSE
ms
Utilizzo librerie esterne
Step 1: Porting
librerie esterneLibreria
Esterna nativa
Libreria
compilata per
Target
Codice nativo
proprietario
APP Android
(Java)
JNI
Step 2: Porting codice
nativo proprietario
Step 3: Rebuild
applicazione
Utilizzo librerie esterne: FFmpeg
“FFmpeg is the leading multimedia framework, able to decode, encode, transcode,
mux, demux, stream, filter and play pretty much anything that humans and
machines have created. It supports the most obscure ancient formats up to the
cutting edge. No matter if they were designed by some standards committee, the
community or a corporation.”rif. https://www.ffmpeg.org
libavcodec
libavfilter libswresample libswscale
libavformatlibavutil
FFmpeg: piattaforme e progetti
Linux
Windows
MAC OSX
iOS
Android
MPlayer
GStreamer
VLC
Linphone
HandBrake
Perian
Soft
ware
&
Fra
mew
ork
Sis
tem
i
Op
era
tivi
HW
FFmpeg: flag di compilazione
FFmpeg consente nativamente numerose ottimizzazioni, per tutte le piattaforme HW
supportate, ad esempio:
• assembler optimizations
• 3DNow! optimizations
• MMX, MMXEXT optimizations
• SSE, SSE2, SSE3, SSSE3, SSE4, SSE4.2 optimizations
• armv”x” optimizations
• VFP optimizations
• NEON optimizations
FFmpeg: compilazione in Android
Porting da ARM a x86
Sample 4:
HelloFFmpeg
Copyright(C) 2012 Intel Corporation. All rights reserved. *Other brands and names are properties of their respective owners.
Recommended