2016-07-11 11 views
3

Nachdem ich auf ihre Github-Seite gegangen bin und einige PDF-Handbücher von ihrer KDE-Docs-Seite gesehen habe, bin ich immer noch verwirrt. Angenommen, es sind diese beiden Linien in einem Testcode:Kcachegrind-Zyklusschätzung

double a1 {asinh(1/ep)};     // 5 instr. 
double b1 {log((1 + sqrt(1 + ep*ep))/ep)}; // 12 instr. 

wo ep etwas Wert ist, vorgegeben werden kann. Die Kommentare gehören mir und in Codeblocks, indem Sie den Debugger mit dem Disassembler ausführen, geduldig dann "nächste Anweisung" und zählen. Diese entsprechen dem, was Kacachegrind sagt, wenn ich "Instruction fetch" zeige. Ich denke, es sollte Sinn machen (ich bin ein Anfänger in C++, BTW). Aber wenn ich zu "Zyklusschätzung" umschalte, bekomme ich sehr seltsame Lesarten. Für das aktuelle Beispiel ist es 115 und 122, aber auch andere, scheinbar ähnliche Ausdrücke, wie: (instr. Fetch zeigt 2 für beide)

double Ap {1.0}; 
double ep {0.9}; 

zeigen 222 und 2! Was geht hier vor? Kann mir bitte jemand erklären?

Antwort

3

Ich denke, ich fand die Antwort nach vielen Klicks und Gewöhnung an Kcachegrind mehr. Der gesamte Zyklus „Schätzung“ verwendet diese Formel:

CEst = Ir + 10 L1m + 100 LLm 

wo

Ir = Instruction Fetch 
L1m = L1 Miss Sum 
Llm = Last-level Miss Sum 

Also, für meinen Fall, wo CEst zeigte 2 und 222, aber 2 Ir jeder, der erste 2 Anweisung hatte abruft und kein Fehler, während der andere 2 Befehl abruft, aber auch zwei Fehler von jedem, =>

2*Ir + 10*2*L1m + 100*2*Llm = 2 + 20 + 200 = 222 

Dies ist bei allen Codes konsistent, die ich ausprobiert habe.