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:
non incollare schermate di codice. sono fondamentalmente inutili ... taglia e incolla il codice attuale. –
@MarcB Ho sostituito lo screenshot con github gist. Spero che vada bene (ho avuto grossi problemi a formattare correttamente questo pezzo di codice). – Lukasz
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