2015-05-25 10 views
10

ho fatto semplice esperimento, mediante l'attuazione di ingenua algoritmo di ricerca char ricerca 1.000.000 righe di 50 caratteri ciascuna (50 mil char mappa) sia su CPU e GPU (con iOS 8 metallo elaborazione conduttura).iOS metallo calcolare gasdotto più lento di implementazione della CPU per l'attività di ricerca

attuazione CPU utilizza ciclo semplice, attuazione del metallo dà ogni kernel 1 fila per elaborare (codice sorgente sotto).

Con mia sorpresa, l'implementazione di Metal è in media 2-3 volte più lenta della CPU lineare e semplice (se utilizzo 1 core) e 3-4 volte più lentamente se utilizzo 2 core (ognuno dei quali cerca metà del database) ! Ho sperimentato diversi thread per gruppo (16, 32, 64, 128, 512), ma ottengo comunque risultati molto simili.

iPhone 6:

CPU 1 core: approx 0.12 sec 
CPU 2 cores: approx 0.075 sec 
GPU: approx 0.35 sec (relEase mode, validation disabled) 

posso vedere lo shader metallo spendere più del 90% di accedere alla memoria (vedi sotto).

Cosa si può fare per ottimizzarlo?

Tutte le comprensioni sarà apprezzato, come non ci sono molte fonti in internet (oltre a guide di programmazione standard Apple), fornendo dettagli sulle parti interne di accesso alla memoria & compromessi specifici per la struttura metallica.

METALLO dettagli implementativi: codice

Host GIST: https://gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d

Kernel (Shader) Codice: https://gist.github.com/lukaszmargielewski/6b64d06d2d106d110126

GPU cattura frame risultati di profiling:

enter image description here

+7

non incollare schermate di codice. sono fondamentalmente inutili ... taglia e incolla il codice attuale. –

+0

@MarcB Ho sostituito lo screenshot con github gist. Spero che vada bene (ho avuto grossi problemi a formattare correttamente questo pezzo di codice). – Lukasz

+0

La prima cosa che cercherò è di spostare searchPhrase nella memoria del dispositivo. Apple dice di non usare lo spazio costante per gli array. Facci sapere se questo fa qualcosa. – Jessy

risposta

0

mi prendo le mie supposizioni troppo, gpu non è ottimizzato per if/else, non predice rami (probabilmente eseguire entrambi), provare a riscrivere l'algoritmo in modo più lineare, senza alcuna condizione o ridurre al minimo indispensabile.

+0

Gli strumenti di profilo mostrano chiaramente (visibile sullo screenshot allegato) che questo non è il collo di bottiglia. Oltre il 90% del tempo è dedicato all'accesso alla memoria. – Lukasz

3

La GPU shader è anche grandi passi verticalmente attraverso la memoria, mentre la CPU si muove orizzontalmente. Considera gli indirizzi effettivamente toccati più o meno simultaneamente da ciascun thread che si esegue in sequenza nello shader mentre leggi charTable. Probabilmente la GPU funzionerà molto più velocemente se la tua tabella CharTable viene trasposta.

Inoltre, poiché questo codice viene eseguito in modo SIMD, ciascun thread della GPU dovrà probabilmente eseguire il ciclo fino alla lunghezza della frase di ricerca completa, mentre la CPU trarrà vantaggio dai primi outs. Il codice GPU potrebbe essere eseguito un po 'più velocemente se si rimuovono i primi tentativi e si mantiene il codice semplice. Molto dipende dalla lunghezza della frase di ricerca e dalla probabilità di una corrispondenza.

Problemi correlati