Diese Frage ist teilweise eine Nachfolgefrage zu GCC 5.1 Loop unrolling.Loop Abrollverhalten in GCC
Nach dem GCC documentation, und wie in meiner Antwort auf die oben gestellte Frage angegeben, Flaggen wie -funroll-loops
wiederum auf „vollständige Schleife Peeling (das heißt eine vollständige Entfernung von Schleifen mit einer kleinen konstanten Anzahl von Iterationen)“. Wenn ein solches Flag aktiviert ist, kann der Compiler daher eine Schleife abwickeln, wenn festgestellt wird, dass dies die Ausführung eines bestimmten Codeabschnitts optimieren würde.
Trotzdem bemerkte ich in einem meiner Projekte, dass GCC Loops manchmal ausrollen würde, obwohl die relevanten Flags nicht aktiviert waren. Betrachten wir zum Beispiel die folgende einfache Stück Code:
int main(int argc, char **argv)
{
int k = 0;
for(k = 0; k < 5; ++k)
{
volatile int temp = k;
}
}
Wenn mit -O1
kompilieren, wird die Schleife entrollt und die folgende Assembler-Code ist mit jedem modernen Version von GCC generiert:
main:
movl $0, -4(%rsp)
movl $1, -4(%rsp)
movl $2, -4(%rsp)
movl $3, -4(%rsp)
movl $4, -4(%rsp)
movl $0, %eax
ret
Selbst wenn Kompilieren mit dem zusätzlichen -fno-unroll-loops -fno-peel-loops
, um sicherzustellen, dass die Flags deaktiviert deaktiviert sind, führt GCC unerwartet weiterhin Loop Enrolling in dem oben beschriebenen Beispiel.
Diese Beobachtung führt mich zu den folgenden eng verwandten Fragen. Warum führt GCC ein Loop-Abrolling durch, obwohl die diesem Verhalten entsprechenden Flags deaktiviert sind? Wird das Abrollen auch von anderen Flags gesteuert, die dazu führen können, dass der Compiler in einigen Fällen eine Schleife abrollt, obwohl -funroll-loops
deaktiviert ist? Gibt es eine Möglichkeit, das Loop-Enrolling in GCC vollständig zu deaktivieren (ein Teil der Kompilierung mit -O0
)?
Interessanterweise hat der Compiler Clang das erwartete Verhalten hier, und scheint nur Abrollung durchzuführen, wenn -funroll-loops
aktiviert ist, und nicht in anderen Fällen.
Vielen Dank im Voraus, alle zusätzlichen Erkenntnisse zu diesem Thema würden sehr geschätzt!
Herzlichen Glückwunsch. Sie haben festgestellt, dass sich verschiedene Compiler im Verhalten unterscheiden und dass die Flags, die Sie ihnen übergeben, nicht immer das bedeuten, was Sie vielleicht meinen. Willkommen in der realen Welt. –
Funktioniert es die Funktionalität Ihres Programms? – Serge
Nein, es bricht nicht die Funktionalität. Es ist eher eine Frage von allgemeinem Interesse, wie GCC Loop Enrolling durchführt und wie dieses Verhalten eingestellt wird. – Pyves