'Kcachegrind cycle estimation

After going to their github page and seeing some pdf manual form their kde docs site, I am still confused. Suppose there are these two lines in a test code:

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

where ep is some value that can be predefined. The comments are mine and done, in Codeblocks, by running the debugger with the disassembler, then patiently hitting "next instruction" and counting. These correspond with what Kacachegrind says if I set it to show "Instruction fetch". I suppose it should make sense (I am a beginner in C++, btw). But if I switch to "Cycle estimation" I get some very strange readings. For the current example, it's 115 and 122, but other, seemingly similar expressions, like:

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

show 222 and 2 (instr. fetch shows 2 for both)! What goes on here? Can someone please explain?



Solution 1:[1]

I think I found the answer after many clicks and getting used to Kcachegrind more. The total "cycle estimation" uses this formula:

CEst = Ir + 10 L1m + 100 LLm

where

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

So, for my case, where CEst showed 2 and 222, but 2 Ir each, the first one had 2 instruction fetches and no misses, while the other had 2 instruction fetches but also two misses of each, =>

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

This is consistent throughout all the codes I tried.

Solution 2:[2]

The current source code of kcachgrind suggest a slightly more complex calculation than in the other answer:

QString GlobalConfig::knownFormula(const QString& name)
{
    if (name == QLatin1String("L1m")) return QStringLiteral("I1mr + D1mr + D1mw");
    if (name == QLatin1String("L2m")) return QStringLiteral("I2mr + D2mr + D2mw");
    if (name == QLatin1String("LLm")) return QStringLiteral("ILmr + DLmr + DLmw");
    if (name == QLatin1String("Bm"))  return QStringLiteral("Bim + Bcm");
    if (name == QLatin1String("CEst"))
        return QStringLiteral("Ir + 10 Bm + 10 L1m + 20 Ge + 100 L2m + 100 LLm");

    return QString();
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 a concerned citizen
Solution 2 PlasmaHH