Speicherzuweisung durch Compiler optimiert

8

In seinem Vortrag "Effizienz mit Algorithmen, Performance mit Datenstrukturen" spricht Chandler Carruth über die Notwendigkeit von ein besseres Allokatormodell in C ++. Das aktuelle Allokator-Modell dringt in das Typsystem ein und macht es deshalb fast unmöglich, in vielen Projekten zu arbeiten. Auf der anderen Seite dringt das Bloomberg-Zuweisungsmodell nicht in das Typsystem ein, sondern basiert auf virtuell Funktionsaufrufe, die es dem Compiler unmöglich machen, die Zuordnung zu "sehen" und zu optimieren. In seinem Vortrag redet er über Compiler, die die Speicherzuordnung deduplizieren (1:06:47).

Es hat einige Zeit gedauert, einige Beispiele für die Speicherzuweisungsoptimierung zu finden, aber ich habe dieses Codebeispiel gefunden, das unter clang kompiliert, die gesamte Speicherzuweisung wegoptimiert und einfach 1000000 zurückgibt, ohne etwas zuzuteilen.

%Vor%

Das folgende Papier Ссылка sagt auch, dass die Zuweisung könnte in Compilern fusioniert werden und scheint darauf hinzuweisen, dass einige Compiler bereits solche Dinge tun.

Da ich sehr an den Strategien für eine effiziente Speicherzuweisung interessiert bin, möchte ich wirklich verstehen, warum Chandler Carruth gegen virtuelle Aufrufe im Bloomberg-Modell ist. Das obige Beispiel zeigt deutlich, dass der Clam die Dinge optimiert, wenn er die Zuweisung sehen kann.

  1. Ich hätte gerne einen "echten Code", wo diese Optimierung nützlich ist und von jedem aktuellen Compiler
  2. erledigt wird
  3. Haben Sie ein Beispiel für einen Code, bei dem verschiedene Zuordnungen durch einen aktuellen Compiler fusioniert werden?
  4. Verstehst du, was Chandler Carruth meint, wenn er sagt, dass Compiler seine Zuweisung in seinem Vortrag um 1:06:47 "deduplizieren" können?
InsideLoop 02.05.2015, 22:34
quelle

1 Antwort

2

Ich habe dieses erstaunliche Beispiel gefunden, das den ersten Punkt der ersten Frage beantwortet. Beide Punkte 2 und 3 haben noch keine Antwort.

%Vor%

wo keine einzige Speicherzuweisung in der for-Schleife mit f_val passiert. Dies passiert jedoch nur mit Clang (Gcc und Icpc scheitern beide daran) und wenn ein etwas komplizierteres Beispiel erstellt wird, wird die Optimierung nicht durchgeführt.

    
InsideLoop 02.05.2015 23:42
quelle