2012-09-05 26 views
5

Questo è con riferimento alla domanda: Checksum code implementation for Neon in IntrinsicsARM e NEON possono funzionare in parallelo?

Apertura delle sotto-domande elencate nel collegamento come le domande individuali separati. Poiché non è possibile richiedere più domande come parte del thread singolo.

Comunque venendo alla domanda:

Può ARM e NEON (parlando in termini di architettura ARM Cortex-A8) in realtà lavorare in parallelo? Come posso raggiungere questo obiettivo?

Qualcuno potrebbe indicarmi o condividere alcune implementazioni di esempio (pseudo-codice/algoritmi/codice, non i fogli teorici di implementazione o discussioni) che utilizza insieme le inter-operazioni di ARM-NEON? (implementazioni con intrinseche o inline-asm.)

+1

Risposta breve: Sì, a condizione che non condividano la stessa memoria. La sincronizzazione dell'accesso alla memoria è molto lenta e lo spostamento dei byte dai registri NEON ai registri ARM è ancora molto lento. Ciò che è ragionevolmente veloce è lo spostamento dei reg di ARM in NEON regs – Sam

+1

Si noti che è solo il parallelismo a livello di istruzione –

+2

Inoltre, si noti che l'unità NEON ha una pipeline piuttosto lunga e il controllo o il trasferimento dei registri tra il vettore e l'unità e le unità intere comportano una penalità piuttosto grande . – marko

risposta

9

La risposta dipende dalla CPU ARM. Il Cortex-A8, ad esempio, utilizza un coprocessore per implementare le istruzioni NEON e VFP, che è collegato al core ARM tramite un FIFO. Quando il decodificatore di istruzioni rileva un'istruzione NEON o VFP, la inserisce semplicemente nella fifo. Il coprocessore NEON recupera le istruzioni dal FIFO e le esegue. Il coprocessore NEON/VFP è quindi in ritardo di un bit - sul Cortext-A8 fino a 20 cicli circa.

Di solito, a tale ritardo non interessa quel ritardo, a meno che non si tenti di trasferire i dati dal coprocessore NEON/VFP al core ARM principale. (Non importa se lo fai spostandoti da un NEON/VPF in un registro ARM o leggendo la memoria usando le istruzioni ARM che sono state recentemente scritte dalle istruzioni NEON). In tal caso, il core ARM principale è in stallo finché il core NEON non ha svuotato il FIFO, cioè fino a 20 cicli circa.

Il core ARM normalmente può accodare le istruzioni NEON/VPF più velocemente di quanto il coprocessore NEON/VPF possa eseguirle. Puoi sfruttarlo per fare in modo che entrambi i core funzionino in parallelo mediante l'interleaving delle tue istruzioni. Ad esempio, inserire un'istruzione ARM dopo ogni blocco di due o tre istruzioni NEON. O forse due istruzioni ARM se si vuole anche sfruttare la capacità di doppio rilascio di ARM. Dovrai utilizzare l'assembly inline per fare ciò: se usi intrinsecamente, la pianificazione esatta delle istruzioni spetta al compilatore e se ha le capacità di interfogliarle in modo appropriato è ipotizzabile da chiunque. Il codice sarà simile a

<neon instruction> 
<neon instruction> 
<neon instruction> 
<arm instruction> 
<arm instruction> 
<neon instruction> 
... 

Non ho un esempio di codice a portata di mano, ma se siete una certa familiarità con il montaggio ARM, interleaving le istruzioni non dovrebbe essere molto più di una sfida. Al termine, assicurati di utilizzare un profiler a livello di istruzione per verificare che le cose funzionino come previsto. Non dovresti vedere praticamente nessun tempo dedicato alle istruzioni ARM.

Ricordare che altre implementazioni ARMv7 potrebbero implementare NEON completamente diverso. Ad esempio, sembra che il Cortex A-9 abbia spostato NEON più vicino al nucleo ARM, e ha una penetrabilità molto inferiore sui movimenti di dati da NEON/VFP a ARM. Indipendentemente dal fatto che ciò influisca sulla programmazione parallela di istruzioni che non conosco, ma è sicuramente qualcosa a cui prestare attenzione.

+1

Grazie a @fgp, questa è stata davvero un'ottima spiegazione. Risponde molte delle mie altre domande. Sarei grato se qualcuno potesse indicarmi alcune implementazioni che sfruttano le funzionalità del braccio-neon usando l'assemblaggio in linea. Non ho potuto trovare molto googling. – nguns

Problemi correlati