Compilers

Welke berekening in de bovenstaande lus komt in aanmerking voor loop-invariant code motion (verplaatsing buiten de lus)? (x en y worden in de lus niet gewijzigd.)

for (i = 0; i < n; i++)
    a[i] = b[i] * (x * y);
  1. AHet geheel b[i] * (x * y)
  2. Bx * y
  3. CDe toewijzing aan a[i]
Antwoord en toelichting tonen

Antwoord: B. x * y

Loop-invariant code motion is een optimalisatie waarbij berekeningen die bij elke iteratie dezelfde waarde opleveren vóór de lus worden gebracht en maar één keer worden berekend. Omdat x en y in de lus niet veranderen, is x * y bij elke iteratie gelijk; t = x * y kan vóór de lus worden berekend en a[i] = b[i] * t volstaat. b[i] verschilt per i, zodat het geheel b[i] * (x * y) niet kan worden verplaatst. De toewijzing aan a[i] is bij elke iteratie een schrijfactie naar een ander element en blijft in de lus.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Welke transformatie is juist als in de bovenstaande lus strength reduction wordt toegepast op de indexberekening i * 4?
  2. Wat is de belangrijkste reden dat de bovenstaande lus moeilijk te vectoriseren is met SIMD-instructies?
  3. Waarom kan de compiler in de bovenstaande functie de optimalisatie waarbij het lezen van *b buiten de lus wordt gebracht niet zonder meer uitvoeren?
  4. Welke combinatie van wat knopen en bogen voorstellen is juist bij de methode van het kleuren van een interferentiegraaf bij registertoewijzing in een compiler?
  5. Wat gebeurt er met de gegenereerde code als bij registertoewijzing een "spill" optreedt?

Vergelijkingen bij dit onderwerp