Compilers

Wat is de belangrijkste reden dat de bovenstaande lus moeilijk te vectoriseren is met SIMD-instructies?

for (i = 1; i < n; i++)
    a[i] = a[i - 1] + b[i];
  1. AHet resultaat a[i-1] van de vorige iteratie is nodig, zodat niet gelijktijdig kan worden berekend
  2. BDe elementen van de array zijn gehele getallen, die met SIMD-instructies niet kunnen worden berekend
  3. CAls het aantal iteraties n tijdens het compileren niet bekend is, is vectorisatie helemaal niet mogelijk
Antwoord en toelichting tonen

Antwoord: A. Het resultaat a[i-1] van de vorige iteratie is nodig, zodat niet gelijktijdig kan worden berekend

Bij vectorisatie worden bijvoorbeeld vier elementen gelijktijdig met één SIMD-instructie berekend. In deze lus is voor het bepalen van a[i] het resultaat van het voorgaande a[i-1] nodig, zodat a[1] tot en met a[4] niet gelijktijdig kunnen worden berekend. Bij een dergelijke afhankelijkheid tussen iteraties (loop-carried dependency) kan het zonder meer niet worden gevectoriseerd. Gehele getallen kunnen ook met SIMD worden berekend, en ook als het aantal tijdens de uitvoering wordt bepaald, kan worden gevectoriseerd door het restant apart te verwerken.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Waarom kan de compiler in de bovenstaande functie de optimalisatie waarbij het lezen van *b buiten de lus wordt gebracht niet zonder meer uitvoeren?
  2. Welke combinatie van wat knopen en bogen voorstellen is juist bij de methode van het kleuren van een interferentiegraaf bij registertoewijzing in een compiler?
  3. Wat gebeurt er met de gegenereerde code als bij registertoewijzing een "spill" optreedt?
  4. Wat is het belangrijkste doel van instructieplanning (instruction scheduling) in een compiler?
  5. Welk effect heeft het toepassen van tail call optimization op de laatste recursieve aanroep van de bovenstaande functie?

Vergelijkingen bij dit onderwerp