Sto cercando di capire la parallelizzazione automatica e un caso particolare di ciò è la vettorizzazione automatica. A quanto ho capito, l'auto-vettorializzazione è più o meno:
Il compilatore prende parti del codice che sono "seriali" e le trasforma in un vettore. Ad esempio:
X1=Y1+Z1
X2=Y2+Z2
Xn=Yn+Zn
viene trasformato in
for(int i=0;i<n;i++)
X[i]=Y[i]+Z[i]
Ora sappiamo tutti che la parte più lenta dell'esecuzione del codice è quella dei rami. E se N è davvero molto grande allora il nostro codice rallenterebbe davvero in questo caso. Quindi il compilatore in questo caso srotolerebbe il nostro loop a qualcosa di più simile a
for(int i=0;i<n;i+=4)
X[i]=Y[i]+Z[i]
X[i+1]=Y[i+1]+Z[i+1]
X[i+2]=Y[i+2]+Z[i+2]
X[i+3]=Y[i+3]+Z[i+3]
Quindi la mia domanda è: perché il compilatore dovrebbe vettorializzare il mio codice se in così tanti casi di azioni eseguite all'interno del ciclo sugli array vengono srotolate a più azioni? Non è controproducente far rotolare il codice in un ciclo all'interno di array e quindi srotolare quel ciclo?