Domanda

Sto usando estensioni SSE disponibili nel processore Core2Duo (compilatore GCC 4.4.1). Vedo che ci sono 16 registri disponibili ognuna delle quali è lunga 128 bit. Ora, posso ospitare 4 valori interi in un unico registro, e 4 in un altro registro e utilizzando intrinseche Posso aggiungere in una sola istruzione. Il vantaggio evidente è così richiedo solo 1 istruzione invece di 4.

La mia domanda è "è che tutto per SIMD?". Lasciate Ho a1, a2, a3, a4, a5, A6, A7, A8 e B1, B2, B3, B4, B5, B6, B7, B8. Let A1, A2 sono registri vettoriali. Ora, A1 <<< (A1, A2, A3, A4) e B1 <<< (B1, B2, B3, B4), e add (A1, B1) si esibirà l'aggiunta di vettore.

Let A2 <<< (A5, A6, A7, A8), B2 <<< (B5, B6, B7, B8). C'è un'istruzione add che può fare add (A1, B1) e aggiungere (A2, B2) contemporaneamente.

Quanti vettore unità funzionali sono disponibili in Core2Duo e dove posso trovare queste informazioni?

qualsiasi altra sorgente di informazioni relative a questi è molto apprezzato.

È stato utile?

Soluzione

  • No, non c'è alcuna singola istruzione SSE per farlo. È necessario emettere due istruzioni. Stai pensando di qualcosa come le istruzioni stringa x86 e il prefisso REP? Non c'è SSE equivalente.

  • Le due operazioni di larghezza 4 vettore essere eseguito concerrently nel senso che tutti i processori moderni sono altamente pipeline. La seconda istruzione passerà il tubo 1 solo ciclo dietro la prima (supponendo i due non sono interdipendenti, che è il caso in esempio), quindi la loro esecuzione si sovrappongono nel tempo, tranne che un ciclo.

  • Ogni nucleo del processore multi-core ha una propria unità funzionale vettoriale. Devi scrivere il codice multi-threaded per trarre vantaggio da questo.

  • Alcune CPU vive 1 versore per core, alcuni hanno solo 1/2! In quest'ultimo caso, l'unità vettore è solo lunga 64 bit ed esegue solo una metà delle istruzioni SSE alla volta. Si ottiene quello che si paga.

  • Si dovrebbe guardare in AVX, la nuova estensione set di istruzioni SSE che si evolve per supportare le unità vettoriali più ampie.

  • Oppure si potrebbe guardare in vera e propria programmazione vettoriale su una GPU con OpenCL e CUDA.

Altri suggerimenti

Non credo che ci sia una singola istruzione per farlo (a meno che snuck uno in una versione recente di SSE).

Tuttavia, dal momento che le operazioni che si sta facendo sono indipendenti, il compilatore può emettere la seconda istruzione aggiuntivo prima che i primi finiture uno. Così la linea temporale sarebbe simile

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

Quindi, anche se si sta utilizzando due istruzioni, si sta non necessariamente prendere il doppio del tempo. La durata effettiva della attesa dipenderà dal processore e la latenza del particolare istruzione che si sta utilizzando.

Ecco una spiegazione più dettagliata di pipelining: http://en.wikipedia.org/wiki/Instruction_pipeline

Per informazioni sulla programmazione SIMD in generale, di Apple pagina SSE è abbastanza bene. E 'un po' orientata verso le persone migrazione delle applicazioni da PowerPC a SSE, ma c'è c'è qualche buona informazione generale troppo.

Il sito di Intel contiene tutte le informazioni di cui avrete bisogno!

http://www.intel.com/products/processor/manuals/

Modifica in risposta al commento: Tutte le informazioni è nei collegamenti legati al precedente ma No. Si potrebbe Pack 8 interi a 16 bit in 1 registro e quindi eseguire 8 simultanea aggiunge ma non SSE non consente per l'aggiunta di 2 registri contemporaneamente.

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