Qual è la massima velocità teorica-up a causa di SSE per una semplice sottrazione binaria?

StackOverflow https://stackoverflow.com/questions/1466907

Domanda

Nel tentativo di capire se o non ciclo interno del mio codice sta colpendo un design barriera di hardware o di una mancanza di comprensione da parte mia barriera. C'è un po 'di più ad esso, ma la domanda più semplice che posso venire con di rispondere è la seguente:

Se ho il seguente codice:

float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;

initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);

for(i=0;i<32768-1;i++) {
  xref=px[i];
  yref=py[i];
  zref=pz[i];
  for(j=0;j<32768-1;j++ {
    deltx=xref-px[j];
    delty=yref-py[j];
    deltz=zref-pz[j];
  } }

Che tipo di massima velocità teorica fino sarei in grado di vedere andando a istruzioni SSE in una situazione in cui ho il controllo completo su di codice (montaggio, intrinseci, qualunque sia), ma nessun controllo su ambiente di esecuzione diversa architettura (vale a dire che è un ambiente multi-utente e quindi non posso fare nulla su come il kernel del sistema operativo assegna il tempo per il mio processo particolare).

In questo momento sto vedendo una velocità massima di 3 volte con il mio codice, quando avrei pensato usando SSE mi darebbe molto più approfondita vettore rispetto alla velocità 3x up indica (presumibilmente la velocità 3x fino mi dice che ho un 4x il throughput massimo teorico). (Ho provato cose come lasciare deltx / delty / deltz essere matrici nel caso in cui il compilatore non era abbastanza intelligente da loro auto-promuovere, ma ho ancora vedere la velocità solo 3x up.) Sto usando il compilatore Intel C con i flag appropriati del compilatore per vettorializzazione, ma non intrinseci ovviamente.

È stato utile?

Soluzione

Dipende dalla CPU. Ma il massimo teorico non otterrà sopra 4x. Non so di una CPU in grado di eseguire più di un'istruzione SSE per ciclo di clock, il che significa che possono al massimo di calcolo 4 valori per ciclo.

La maggior parte CPU può fare almeno un'istruzione scalare punto per ogni ciclo di galleggiamento, quindi in questo caso si vedrebbe un massimo teorico di un aumento di velocità 4x.

Ma si dovrà cercare il throughput delle istruzioni specifiche per la CPU è in esecuzione su.

Un aumento di velocità di pratica 3x è piuttosto buono.

Altri suggerimenti

Penso che probabilmente avresti dovuto intercalare il ciclo interno in qualche modo. Il vettore a 3 componenti è sempre fatto in una sola volta, ma questo è solo 3 operazioni in una sola volta. Per arrivare a 4, faresti 3 componenti del primo vettore, e 1 dalla prossima, poi 2 e 2, e così via. Se avete stabilito una sorta di coda che carichi ed elabora i dati 4 componenti in un momento, poi separarsi dopo, che potrebbe funzionare.

Edit: Si può srotolare il ciclo interno per fare 4 vettori per ogni iterazione (supponendo che la dimensione dell'array è sempre un multiplo di 4). Che sarebbe compiere ciò che ho detto sopra.

Si consideri: Quanto è grande un galleggiante? Quanto è grande l'istruzioni SSEx? Il rapporto dovrebbe dovrebbe darvi una sorta di ragionevole limite superiore.

E 'anche interessante notare che out-of-order tubi giocano Havok con ottenere buone stime di aumento di velocità.

Si dovrebbe prendere in considerazione ciclo piastrelle - il modo in cui si accede valori nel ciclo interno è probabilmente causando un sacco di botte nella cache di dati L1. Non è troppo male, perché tutto probabilmente si inserisce ancora in L2 a 384 KB, ma non v'è facilmente un ordine di differenza grandezza tra una cache hit L1 e una cache hit L2, quindi questo potrebbe fare una grande differenza per voi.

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