Vektorizacija

**Vektorizacija** kompiuterijoje – procesas, paverčiantis kompiuterio programą iš skaliarinio realizavimo, kuris atlieka operacijas keliais operandais vienu laiku, į vektorizuotą programą, kur viena instrukcija gali įvykdyti daugialypes operacijas ar vektoriaus poros (gretimų verčių serija) operandus. Vektoriaus apdirbimas yra pagrindinė ypatybė ir tradicinių, ir šiuolaikinių superkompiuterių.

Viena pagrindinė tyrinėjimo tema kompiuterijoje yra automatinės vektorizacijos metodų paieška;
ieškojimas metodų, kurie leistų kompiliatoriui paversti skaliarines programas į vektorizuotas programas be žmogaus pagalbos.

## Automatinė vektorizacija
Automatinis vektorizavimas, kompiuterio programos kontekste, siejasi su automatine transformacija serijos operacijų, įvykdytų iš eilės, viena operacija vienu metu, į operacijas, įvykdytas lygiagrečiai, po kelias vienu metu. Būdas tinkamas apdirbti vektoriaus procesorius.

Pavyzdys būtų programa, kuri padaugina du skaitmeninių duomenų vektorius. Skaliarinis metodas būtų:

  for (i = 0; i  0)
       C[i] = B[i];
     else
       D[i] = D[i-1];
  }
* Po predikavimo
  for (i = 0; i  0;
     NP = !P;
     C[i] = B[i];     (P)
     D[i] = D[i-1];   (NP)
  }
kur (P) reiškia tarinį, saugantį predikavimą.
* Po vektorizacijos
  for (i = 0; i  (0,0,0,0);
     vNP = vec_not(vP);
     C[i:i+3] = B[i:i+3];     (vP)
     (NP1,NP2,NP3,NP4) = vNP;
     D[i]   = D[i-1];         (NP1)
     D[i+1] = D[i];           (NP2)
     D[i+2] = D[i+1];         (NP3)
     D[i+3] = D[i+2];         (NP4)
  }
* Po vektorių predikatoriaus pašalinimo
  for (i = 0; i  (0,0,0,0);
     vNP = vec_not(vP);
     C[i:i+3] = vec_sel(C[i:i+3],B[i:i+3],vP);
     (NP1,NP2,NP3,NP4) = vNP;
     D[i]   = D[i-1];         (NP1)
     D[i+1] = D[i];           (NP2)
     D[i+2] = D[i+1];         (NP3)
     D[i+3] = D[i+2];         (NP4)
  }
* Po skaliarų predikatorių pašalinimo
  for (i = 0; i  (0,0,0,0);
     vNP = vec_not(vP);
     C[i:i+3] = vec_sel(C[i:i+3],B[i:i+3],vP);
     (NP1,NP2,NP3,NP4) = vNP;
     if (NP1) D[i]   = D[i-1];
     if (NP2) D[i+1] = D[i];
     if (NP3) D[i+2] = D[i+1];
     if (NP4) D[i+3] = D[i+2];
  }

## Sumažinimas vektorizacijos viršuje esant kontrolės srovei
Turint atlikti instrukcijas visuose kontrolės keliuose vektoriaus kode buvo vienas iš pagrindinių faktorių, kurie lėtina vektoriaus kodą dėl skaliarinės pagrindinės linijos. Norint sumažinti šį vektorizacijos viršuje, vektoriaus šakos gali būti įdėtos, kad apeitų vektoriaus instrukcijas, panašias į būdą, kuriuo skaliarinės šakos apeina skaliarines instrukcijas. Apačioje, AltiVec tariniai yra panaudoti, kad parodytų, kaip tai gali būti pasiekiama.

* Skaliarinė pagrindinė linija (originalus kodas)
  for (i = 0; i  0)
     {
       C[i] = B[i];
       if (B[i]  (0,0,0,0);
     C[i:i+3] = vec_sel(C[i:i+3],B[i:i+3],vPA);
     vT = B[i:i+3]  (0,0,0,0);
        C[i:i+3] = vec_sel(C[i:i+3],B[i:i+3],vPA);
        vT = B[i:i+3] < (0,0,0,0);
        vPB = vec_sel((0,0,0,0), vT, vPA);
        if (vec_any_ne(vPB,(0,0,0,0)))
        {
           D[i:i+3] = vec_sel(D[i:i+3],E[i:i+3],vPB);
        }
     }
  }
Yra du veiksmai pažymėti galutiniam kodui su vektoriaus šakomis; Pirma, predikatas, apibrėžiantis instrukciją vPA, yra taip pat įtrauktas kūno viduje išorinės vektoriaus šakos vartojant vec_any_gt. Antra, pelningumas vidinės vektoriaus šakos vPB priklauso nuo sąlyginės vPB tikimybės, turėjimas neteisingų verčių visuose laukuose, duotuose vPA, turi neteisingas vertes visuose laukuose.