Domanda

Ho bisogno di ottimizzare po 'di codice C, che fa un sacco di calcoli di fisica, utilizzando le estensioni SIMD sulla SPE del processore Cell. Ciascun operatore vettore può elaborare 4 galleggianti contemporaneamente. Quindi idealmente mi aspetterei un 4x aumento di velocità nel caso più ottimistico.

Pensi che l'utilizzo di operatori vettore potrebbe dare incrementi nella velocità più grandi?

Grazie

È stato utile?

Soluzione

La migliore ottimizzazione si verifica nel ripensare l'algoritmo. Eliminare passaggi inutili. Trova più un modo diretto di realizzare lo stesso risultato. Calcolare la soluzione in un dominio più rilevante per il problema.

Ad esempio, se la matrice vettore è un elenco di n che si trovano tutti sulla stessa linea, quindi è sufficiente trasformare i punti finali solo ed interpolare i punti intermedi.

Altri suggerimenti

Si può dare una migliore velocità fino a 4 volte il punto sopra dritto galleggianti come le istruzioni SIMD potrebbero essere meno esatto (Non tanto da dare troppi problemi però) e in modo da prendere un minor numero di cicli da eseguire. Dipende molto.

Miglior piano è quello di imparare molto su come il processore si sta ottimizzando per possibile. Si possono trovare si può dare molto meglio di 4x miglioramenti. Si può scoprire che non è possibile. Non possiamo dire se senza sapere di più su l'algoritmo si sta ottimizzando e quello della CPU ci si rivolge.

Per conto proprio, no. Ma se il processo di ri-scrivere i tuoi algoritmi per sostenerli anche accade per migliorare, per esempio, la cache località o un comportamento ramificazione, allora si potrebbe trovare non collegati velocità-up. Tuttavia, questo è vero per ogni ri-scrittura ...

Questo è del tutto possibile.

  • Si può fare micro ottimizzazioni più intelligente a livello di istruzioni di un compilatore, se si sa cosa si sta facendo.
  • La maggior parte SIMD set di istruzioni offerte diverse operazioni potenti che non hanno alcun equivalente nella normale scalare codice FPU / ALU (per esempio PAVG / PMIN ecc SSE2). Anche se questi non si adattano esattamente il problema, spesso è possibile combinare questi istruzioni per la grande effetto.
  • Non sei sicuro di cellulare, ma la maggior parte i set di istruzioni SIMD hanno caratteristiche di accedere alla memoria ottimizzare, ad esempio per i dati prefetch nella cache. Ho avuto ottimi risultati con questi.

Ora questo non è cellulare o PPC affatto, ma un semplice filtro immagine convoluzione mio schiera un aumento di velocità 20x (C vs SSE2) su atomo, che è superiore al livello di parallelismo (16 pixel per volta) .

Dipende l'architettura .. Per il momento mi assumo x 86 architettura (aka SSE).

È possibile ottenere fattore di quattro su cicli stretti facilmente. Basta sostituire la matematica esistente con istruzioni SSE e il gioco è fatto.

Si può anche ottenere un po 'più di questo perché se si utilizza SSE fate i conti in registri che non vengono di solito utilizzati dal compilatore. Questo libera il General Purpose Register per altri compiti come il controllo del ciclo e calcolo degli indirizzi. In breve, il codice che circonda l'istruzione SSE sarà più compatto ed eseguire più velocemente.

E poi c'è la possibilità di suggerire il controller di memoria come si desidera accedere alla memoria, per esempio se si desidera memorizzare i dati in un modo che bypassa la cache o meno. Per larghezza di banda algoritmi affamati che può dare una certa velocità di più in più ontop di questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top