Autore Topic: Aiuto Tegra2  (Letto 1620 volte)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Aiuto Tegra2
« il: 01 Agosto 2012, 09:37:10 CEST »
0
Ho un paio di librerie native che mi sono scritto per manipolare velocemente delle immagini. Su un Exynos 4210 (galaxy s2) va a meraviglia, su Tegra2 (galaxy tab 2) le prestazioni sono a dir poco imbarazzanti. Ok la diversa risoluzione e ok il fatto che il secondo è cloccato a 1Ghz vs 1.2Ghz dell'exynos ma siamo nell'ordine di andare 4-5 volte più lento.

Domanda numero uno: siccome nel codice nativo non faccio niente di particolare se non leggere e scrivere dati su degli array, siete a conoscenza di colli di bottiglia su operazioni classiche sul canvas coi tegra2?

Preso dallo sconforto ho deciso di riscrivermi il tutto con OpenGL ES 2.0.

Ovviamente su Exynos va ancora meglio di prima. Su tegra due fallisce quando renderizzo senza segnalare errori particolari.

Visto che ho dei NaN nel mio fragment shader (che ovviamente vengono segati via) temo siano quelli, e quindi ecco la domanda numero due: sapete se quando un Tegra2 genera un NaN fallisce sistematicamente o fa come Exynos procedendo senza problemi???

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aiuto Tegra2
« Risposta #1 il: 01 Agosto 2012, 10:20:00 CEST »
+1
Il Tegra2 non ha le istruzioni NEON, quindi se le usi salta il programma, per il resto ha tutte le funzioni di un ARM Cortex-A9.

Controlla il logcat, molto probabilmente il compilatore dei fragment  shader genera degli errori o altro sul codice rallentando il tutto. Controlla il codice dei fragment  shader e evita di generare degli NaN.


adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aiuto Tegra2
« Risposta #2 il: 01 Agosto 2012, 11:18:47 CEST »
0
Riguardo alla parte canvas:

le librerie le ho compilate senza NEON, quelle funzionano (vedo a schermo le stesse identiche cose rispetto al galaxy s2) ma vanno molto lente su tegra 2.

A livello di codice nativo fondamentalmente faccio un memcpy e poi manipolo degli array, quindi a mio avviso qui si tratta solo di caratteristiche della cpu, cloccata più bassa. Non ho fatto profiling ma l'unica cosa che mi può venire in mente è un problema di caching (cioè che tegra 2 abbia meno cache di exynos) o che la memoria sia speventosamente più lenta. O tutto quanto assieme in un malefico connubio.  :D

Per la parte java mi affido a san dalvik ma tutto quello che faccio è una drawBitmap sul canvas, a meno che non sia implementata malissimo su ICS su tegra2 non so che altro fare.

Se interessa a qualcuno a uso futuro posso fare del profiling ma su un canvas a questo punto ho due possibilità:

- la combinazione cache/clock della memoria/clock della CPU è spaventosamente meno performante in un tegra2 rispetto ad un exynos
- l'implementazione della funzione drawBitmap è molto problematica in un tegra2 o effettua delle conversioni di colore ( anche se forzo il modo video a 32-bit etc etc).

Capitolo GPU/Shaders:

Il logcat beve tutto, non fa altro che fallire sulla drawArrays. Allla fine sono riuscito a risolvere (e come prima cosa avevo tolto i NaN, senza effetto alcuno..).

Sempre a uso e consumo di chi avesse problemi di compatibilità con tegra2.

1- non wrappa le texture che non sono potenze di 2, dovete usare il clamp mode, in alternativa dovete riscalare la texture alla potenza di due maggiore e poi potete renderizzare col wrap (questo non ha un impatto sulla qualità perchè l'effetto distorsione viene compensato dal restringimento quando renderizzate, ci lasciate "solo" più memoria per strada).
2- verificate come prendete la location degli uniform e come bindate gli attributi perchè quando compilate lo shader il maledetto riorganizza tutto. Su galaxy s2 con Exynos mantiene l'ordine come accade in Direct3D, su Tegra le location e il binding sono del tutto arbitrari.

Cmq grazie lo stesso.  ;-)
« Ultima modifica: 01 Agosto 2012, 11:20:30 CEST da undead »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aiuto Tegra2
« Risposta #3 il: 01 Agosto 2012, 13:04:26 CEST »
0
Il Tegra 2 non ha un buon tranfer rate in memoria ma ci sono delle ottimizzazioni che si possono fare a livello assembler:

Mihai Mobile : Android ARM: PLD preload magic

Il Tegra 2 ha l'estensione "GL_ARB_texture_non_power_of_two" ma non so' se ci sono casi in cui non funziona, io da buon programmatore delle vecchie OpenGL e conosco anche Renderman, uso sempre e solo texture con dimensione potenza di 2 (mip mapping docet).

Ho notato anch'io il riordino delle location ma la documentazione non impone l'ordine:

glGetUniformLocation
adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aiuto Tegra2
« Risposta #4 il: 01 Agosto 2012, 14:37:37 CEST »
0
Il Tegra 2 non ha un buon tranfer rate in memoria ma ci sono delle ottimizzazioni che si possono fare a livello assembler:

Mihai Mobile : Android ARM: PLD preload magic
Oddio spero che la memcpy sia più veloce, non ho fatto profiling ma 25ms solo per un loop del genere è folle.

Citazione
Il Tegra 2 ha l'estensione "GL_ARB_texture_non_power_of_two" ma non so' se ci sono casi in cui non funziona, io da buon programmatore delle vecchie OpenGL e conosco anche Renderman, uso sempre e solo texture con dimensione potenza di 2 (mip mapping docet).

Ho notato anch'io il riordino delle location ma la documentazione non impone l'ordine:

glGetUniformLocation
Ho fatto più Direct3D che OpenGL e l'errore sugli uniform è tutto mio... avevo fatto una stupidaggine e scrivevo sulla stessa location su due shader diversi anche se gli attributi erano gli stessi, dichiarati nello stesso ordine. Mi ha tratto in inganno l'exynos che beve tutto e invece di dare la colpa al mio codice ho puntato il dito su tegra2.  :-P

Per quanto riguarda il non power of two in GLES 2.0 le texture con dimensioni strane funzionano ma non puoi wrapparle. Ora... se io scrivo questo:

Codice (Java): [Seleziona]
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);

Non mi segnala niente ma fallisce il sampling (riporta colore 0,0,0,1) anche se non sto wrappando.
Invece con:

Codice (Java): [Seleziona]
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);

Funziona ed è perfetto anche visivamente perchè non sto wrappando.

Io non sono così dentro alla filosofia OpenGL ma se il driver non mi supporta il repeat su una texture che non è potenza di due non dovrebbe generarmi un errore quando faccio il bind di una texture NPOT e la modalità è stata settata su GL_REPEAT???

 :-(

ps molto interessante il blog che hai linkato!  ;-)

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aiuto Tegra2
« Risposta #5 il: 02 Agosto 2012, 01:10:56 CEST »
0
Non ho sotto mano del codice con quella mappatura sotto Android comunque con le OpenGL-ES dopo che esegui una funzione puoi interrogare la "GLES20.glGetError" per vedere se esiste un errore nei parametri che hai utilizzato.
adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Aiuto Tegra2
« Risposta #6 il: 02 Agosto 2012, 12:15:24 CEST »
0
Si chiamo la geterror e non dice nulla, é proprio quello che é strano. O sul set del wrap mode o sul bind pensavo lo segnalasse invece va tutto liscio. Di fatto va liscio anche il rendering, a parte che il texel é nero.

Insomma se vi viene una texture nera e nessun errore date un occhio anche alla risoluzione della texture!