2010-09-05 10 views
5

Ho bisogno di ottimizzare qualche codice C, che fa molti calcoli fisici, usando le estensioni SIMD sull'SPE del processore della cella. Ogni operatore di vettore può elaborare 4 flottanti allo stesso tempo. Quindi idealmente mi aspetterei un aumento di 4x nel caso più ottimistico.Qual è il limite dell'ottimizzazione con SIMD?

Pensa che l'uso di operatori di vettori potrebbe dare maggiore velocità?

Grazie

risposta

4

La migliore ottimizzazione si verifica nel ripensare l'algoritmo. Elimina i passaggi non necessari. Trova più un modo diretto per ottenere lo stesso risultato. Calcola la soluzione in un dominio più pertinente al problema.

Ad esempio, se l'array vettore è un elenco di n che sono tutti sulla stessa riga, allora è sufficiente trasformare solo i punti finali e interpolare i punti intermedi.

+0

sì, al momento questa è l'opzione migliore che sto considerando. – flow

+0

Tutto ciò è corretto, ma ortogonale alla domanda su cosa SIMD può fare per voi ... – dmckee

+0

cosa intendete con 'ortogobale'? – flow

3

Da soli, n. Ma se il processo di riscrittura dei tuoi algoritmi per supportarli, avviene anche per migliorare, ad esempio, la localizzazione della cache o il comportamento delle diramazioni, quindi potresti trovare accelerazioni non correlate. Tuttavia, questo è vero per qualsiasi riscrittura ...

+0

Questi incrementi non correlati sono solitamente chiamati super-velocità. –

4

Può dare una velocità migliore di 4 volte rispetto al punto in virgola mobile come le istruzioni SIMD potrebbero essere meno esatte (non tanto per dare troppi problemi però) e quindi prendere meno cicli da eseguire. Dipende davvero.

Il miglior piano è quello di apprendere quanto più possibile sul processore che si sta ottimizzando. Potresti scoprire che può darti molto meglio di 4x miglioramenti. Potresti scoprire che non puoi. Non possiamo dire però senza saperne di più sull'algoritmo che stai ottimizzando e su quale CPU stai mirando.

+0

Vuoi dire passare dalla doppia alla singola precisione? SSE2 e meglio supporta la doppia precisione e la maggior parte delle piattaforme supporta l'IEEE o almeno soddisfa i requisiti di precisione ... che non sono tali da rendere rara l'aritmetica a ciclo singolo. – Potatoswatter

+0

No, non lo faccio. Sto pensando ad alcune piattaforme diverse che ho usato. Uno è x86 dove l'uso di SSE scalari può essere molte volte più veloce rispetto all'utilizzo di x87. Analogamente su una piattaforma basata su MIPS, le istruzioni parallele sono state eseguite più rapidamente rispetto alle loro controparti scalari e anche in questo caso è possibile eseguire la pipeline simultanea di istruzioni standard per FPU scalari e parallele. – Goz

+0

Io non la penso così. Il PowerPC ad esempio ha istruzioni che valutano solo il risultato, il che le rende molto più veloci, ma perdi un po 'di precisione. –

1

Dipende dall'architettura .. Per il momento presumo l'architettura x86 (aka SSE).

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

Si può anche ottenere un po 'di più perché se si utilizza SSE si fa la matematica in registri che di solito non vengono utilizzati dal compilatore. Ciò libera il registro generale per altre attività come il controllo del loop e il calcolo dell'indirizzo. In breve, il codice che circonda l'istruzione SSE sarà più compatto ed eseguirà più velocemente.

E poi c'è l'opzione per suggerire al controller di memoria come si desidera accedere alla memoria, ad es. se si desidera memorizzare i dati in modo che ignori la cache o meno. Per algoritmi affamati di larghezza di banda che potrebbero darti un po 'più di velocità in più.

+0

anche questo è un buon punto – flow

+0

Sto usando SPE del processore cella – flow

+0

Oh, stai lavorando su SPE. Bene, qui si applicano regole completamente diverse. la potenza di elaborazione è raramente un bottleck. Invece il compito è quello di ottenere i dati dentro e fuori la SPU senza stallo. Non banale da fare! –

2

Questo è interamente possibile.

  • È possibile eseguire più intelligenti micro ottimizzazioni a livello di istruzioni di un compilatore, se si sa cosa si sta facendo.
  • La maggior parte dei set di istruzioni SIMD offre diverse potenti operazioni che non hanno alcun equivalente nel normale codice scalare FPU/ALU (ad esempio PAVG/PMIN ecc. In SSE2). Anche se questi non si adattano esattamente al tuo problema, puoi spesso combinare queste istruzioni per ottenere grandi risultati.
  • Non sono sicuro di Cell, ma la maggior parte dei set di istruzioni SIMD offre funzionalità per ottimizzare l'accesso alla memoria, ad esempio per eseguire il precaricamento dei dati nella cache. Ho avuto ottimi risultati con questi.

Ora questo non è cella 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 a un tempo).

Problemi correlati