Webinar porting e ottimizzazione per x86

31
Copyright(C) 2012 Intel Corporation. All rights reserved. *Other brands and names are properties of their respective owners. #IntelAndroid Massimiliano Torregiani #IntelAndroid

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.

Transcript of Webinar porting e ottimizzazione per x86

Page 1: Webinar   porting e ottimizzazione per x86

Copyright(C) 2012 Intel Corporation. All rights reserved. *Other brands and names are properties of their respective owners.

#IntelAndroid

Massimiliano Torregiani #IntelAndroid

Page 2: Webinar   porting e ottimizzazione per x86

25/11/2014, webinar

Porting e ottimizzazione

di applicazioni NDK per

dispositivi Intel

Page 3: Webinar   porting e ottimizzazione per x86

Nice to Meet You!

Massimiliano TorregianiManager @ Kalpa srl

Intel Software Innovator

email: [email protected]

twitter: @maxtorregiani

linkedin: it.linkedin.com/pub/massimiliano.torregiani/

Page 4: Webinar   porting e ottimizzazione per x86

Android SDK e NDK

Programmazione SDK

compile once, run everywhere

Programmazione NDK

compile once, run everywhere

oppure oppure

Page 5: Webinar   porting e ottimizzazione per x86

Modello per applicazioni SDK / NDK

Page 6: Webinar   porting e ottimizzazione per x86

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

Page 7: Webinar   porting e ottimizzazione per x86

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

Page 8: Webinar   porting e ottimizzazione per x86

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)

Page 9: Webinar   porting e ottimizzazione per x86

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.

Page 10: Webinar   porting e ottimizzazione per x86

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++

Page 11: Webinar   porting e ottimizzazione per x86

Porting da ARM a x86

Sample 1:

HelloJni

Page 12: Webinar   porting e ottimizzazione per x86

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”

Page 13: Webinar   porting e ottimizzazione per x86

Porting da ARM a x86

Sample 2:

HelloMemory

Page 14: Webinar   porting e ottimizzazione per x86

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

Page 15: Webinar   porting e ottimizzazione per x86

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.

Page 16: Webinar   porting e ottimizzazione per x86

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

Page 17: Webinar   porting e ottimizzazione per x86

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

Page 18: Webinar   porting e ottimizzazione per x86

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.

Page 19: Webinar   porting e ottimizzazione per x86

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)

Page 20: Webinar   porting e ottimizzazione per x86

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

Page 21: Webinar   porting e ottimizzazione per x86

Sample 3: FIR algorithm

Finite Impulse Response (FIR), è una tipologia di filtro

digitale caratterizzata da una risposta impulsiva di durata

finita.

Page 22: Webinar   porting e ottimizzazione per x86

Porting da ARM a x86

Sample 3:

HelloNeon

to

HelloSSE

Page 23: Webinar   porting e ottimizzazione per x86

Benchmark: device under-test

Samsung Tab 3

Intel Atom Z2560

Dual Core / Quad

thread

1.6GHz

SIMD technology:

SSSE3, SSE3, SSE2

Cache: 1MB

Page 24: Webinar   porting e ottimizzazione per x86

Benchmark: results

0 200 400 600 800 1000 1200

C version (arm translation)

C version (x86)

C version (x86 & flags)

NEON translation

SSE

ms

Page 25: Webinar   porting e ottimizzazione per x86

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

Page 26: Webinar   porting e ottimizzazione per x86

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

Page 27: Webinar   porting e ottimizzazione per x86

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

Page 28: Webinar   porting e ottimizzazione per x86

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

Page 29: Webinar   porting e ottimizzazione per x86

FFmpeg: compilazione in Android

Page 30: Webinar   porting e ottimizzazione per x86

Porting da ARM a x86

Sample 4:

HelloFFmpeg

Page 31: Webinar   porting e ottimizzazione per x86

Copyright(C) 2012 Intel Corporation. All rights reserved. *Other brands and names are properties of their respective owners.