Forum: Mikrocontroller und Digitale Elektronik Zero-overhead loop buffer, Erklärung


von Alexander M. (a_lexander)


Lesenswert?

Hallo Zusammen,

Ich habe mir eben die esp-idf genauer angeschaut und bin dann ziemlich 
früh im Bootloader-Code auf folgende Anweisung gestoßen:
1
static inline void cpu_init_memctl()
2
{
3
#if XCHAL_ERRATUM_572
4
    uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
5
    WSR(MEMCTL, memctl);
6
#endif // XCHAL_ERRATUM_572
7
}
--> Bedeutung: Setze Register MEMCTL auf 0 zurück, um Fehler durch die 
Xtensa Architektur zu vermeiden
--> siehe hier: 
https://github.com/espressif/esp-idf/commit/964f5a91f7fe2d2168d58db5314e11c91289aa17

Xtensa Datasheet: 
https://manualzz.com/doc/29044652/xtensa-lx7-microprocessor-data-book 
(meiner Meinung nach interessant Seite 565)

Die Frage ist:
Kann mir vielleicht jemand den Begriff "zero-overload loop buffer" 
erklären? Was ist der Unterschied zum "loop unrolling" (= Code in einer 
Schleife wird vervielfacht geschrieben, um Abfragen nach Schleifenende 
zu reduzieren)

So wie ich das gelesen habe, ist der "zero-overload loop buffer" ähnlich 
zum "loop unrolling", jedoch wird das dann automatisch im Prozessor 
angewandt und nicht wie im "loop unrolling" durch den Code vom 
Programmierer festgelegt. Wie funktioniert aber dieses automatische 
anwenden dieses Algorithmus?

Vielen Dank.

Grüße

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Der "Zero-Overhead-Loop" beim xtensa funktioniert nicht "automatisch". 
Vereinfacht: Im (Assembler-)Code wird dem Prozessor (per LOOP-Anweisung) 
gesagt: "Wiederhole die Ausführung der folgenden X Anweisungen N-mal", 
und die CPU macht dann den Rest. Das erspart den normalen Loop-Overhead 
um z.B. einen Zähler in einem Register zu initialisieren, im Loop zu 
dekrementieren, und vor allem den "teuren" Branch am Ende der Schleife.

Performance-mäßig müsste das dann sehr nah an das komplette Unrolling 
einer Schleife herankommen, mit dem Potenzial, sogar noch schneller zu 
sein, weil keine Branches aus der Schleife heraus benötigt werden und 
nur der Code für eine Schleifen-Iteration geladen und im Cache 
gehalten werden muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.