ARM Neon, la tecnologia per il futuro.

13 agosto 20096 commenti

Ultimamente ci capita di leggere che i nuovi smartphone basati su android monteranno processori della famiglia ARMv7 (ad esempio il nuovo motorola Sholes) che integra al suo interno il set di istruzioni ARM NEON.

Oggi ARM sta per Advanced RISC Machine, ma alla nascita significava Acorn RISC Machine dal nome dell'azienda fondatrice la Acorn Computers Ltd. Oggi l'architettura ARM è uno standard per ogni applicazione embedded, cellulari smartphone router ecc..

Cose’ Neon? Neon è una estensione dell’instruction-set del processore, questo sta a significare che aggiunge alle normali istruzioni RISC di una tipica architettura ARM delle nuove che possono lavorare in parallelo al processore in maniera piu’ ottimizzata e quindi veloce.
Queste nuove istruzioni si occupano di eseguire operazioni su dati dello stesso tipo che necessitano delle medesime azioni, per questo quando ci si riferisce a queste particolari architetture si sente parlare di SIMU (Single Instruction Multiple Date).

Le operazioni che beneficeranno saranno tutte quelle dove è possibile avere una gran quantità di dati da elaborare in maniera analoga, e queste sono ad esempio (tratti dal data-sheet NEON):

  • Giochi – render
  • Riconoscitore vocale
  • Effetti per l’interfaccia del dispositivo
  • manipolazioni di segnali audio Hi-fi e surround
  • Codifica e decodifica segnali video

Per capire meglio di come un’architettura di questo genere può apportare dei benefici dobbiamo addentrarci leggermente piu’ a fondo nell’argomento.
Una normale CPU è un’architettura SISD (Single Instruction Single Data) questo significa che ogni istruzione vale solo per un dato, come ad esempio la somma di due numeri.

figure6Figura 1: Architettura SISD e SIMD

L’architettura SIMU si applica, come detto prima, quando si hanno dati dello stesso tipo, pensiamo all’esempio molto comune in letteratura dei pixel, puo’ capitare di cambiare luminosità allo schermo trasformare l’immagine in una in bianco e nero ecc..  tutte queste operazioni sono semplici operazioni iterate su ogni singolo pixel.
Per semplicità prendiamo l’esempio del cambio di luminosità, a ogni componente rgb di ogni pixel deve essere sommato un valore proporzionale all’incremento di luminosità, se prendiamo un normale schermo di un smartphone attuale basta moltiplicare il numero di pixel per tre 480x320x3 che risulta essere 460800 e quindi sono necessarie 460800 somme. Da questo esempio con un’immagine di dimensioni ridicole e una semplice somma per ogni componente possiamo capire come può essere gravoso il lavoro di una CPU ad esempio nella codifica e la decodifica di segnali  video magari HD.
Di queste operazioni semplici ripetitive ne esistono veramente tante nel signal-processing e quindi nelle CPU di un normale pc non sono una novità, sono state introdotte già dai tempi del pentium con le istruzioni MMX seguite poi da SEE 3DNow SEE2 ecc..
Queste istruzioni “multimediali” operano su vettori, in particolare nel caso del NEON in vettori di 64 o 128 bit di lunghezza, questi vettori sono composti da caselle con dati che possono avere diverse lunghezza, 8, 16, 32 o 64 bit (Fig. 2).

array2Figura 2: Possibili costruzioni di array Q da 128 bit

Immaginiamoci il caso precedente, ogni valore r,g,b di ogni pixel è composto normalmente da 16bit (65536 colori), se dobbiamo aumentare la luminosità possiamo costruirci dei vettori da 8 elementi (8*16bit= 128bit) e processarli con le istruzioni NEON. In questo modo in un ciclo del processore avremmo 8 valori mentre con un normale processore dovremmo aspettare 8 cicli per avere la stessa sequenza.
Nella Figura 3 è rappresentato un esempio analogo al nostro tranne per il fatto che sono stati utilizzati i registri ‘D’ che nella terminologia ARM  NEON stanno per i registri a 64 bit.

sommaFigura 3: esempio di somma multima

Esasperando questo ragionamento se dovessimo processare dati da 8bit (ad esempio caratteri ASCII) si potrebbero ottenere 16 risultati per ogni ciclo di processore.
Quindi per riassumere, un normale processore opera su valori singoli (scalari), un’architettura SIMU opera su vettori che sono un insiemi di valori, la cosa piu’ interessante è che queste operazioni vengono eseguite nello stesso tempo perché ci sono strutture parallelizzate che eseguono singole operazioni contemporaneamente.
Chiaramente i benefici sopra citati si hanno solo nel caso di dover processare una gran quantità di dati con le stesse caratteristiche, pensiamo ad esempio a del codice con istruzioni condizionale in cui questo tipo di approccio non può funzionare perché non possibile, per così dire, pianificare il lavoro da fare eseguire alla CPU.
L’architettura NEON può operare sia su dati interi che a virgola mobile, può lavorare sia su dati allineati che non allineati, quest’ultima caratteristica è molto importante perché in questo modo è più facile poter costruire dei vettori anche fetch-ando dati da allocazioni non allineate di memoria.

A parte l’aspetto tecnico è bello vedere come android sia sempre sulla cresta della tecnologia, aiutata anche dal grande lavoro che moltissime persone dedicano alle sviluppo a quel grande progetto open-source che prende il nome di kernel Linux.

Per approfondire l’argomento sono presenti sul sito ARM alcuni documenti interessanti:
ARM Neon

Loading...
  • FunkyPorcini

    O.o Bell’articolo! Complimenti, super tecnico! :)

  • FunkyPorcini

    O.o Bell’articolo! Complimenti, super tecnico! :)

  • Si, Quoto FunkyPorcini.. L’articolo è molto bello . Complimentoni..

    PS: Adesso ci manca una batteria ad idrogeno e poi i dispositivi android sono perfetti..

  • Si, Quoto FunkyPorcini.. L’articolo è molto bello . Complimentoni..

    PS: Adesso ci manca una batteria ad idrogeno e poi i dispositivi android sono perfetti..

  • juza

    Grazie per l’articolo Op15L, interessante e molto chiaro

  • juza

    Grazie per l’articolo Op15L, interessante e molto chiaro