Kcachegrind 循环估计
Kcachegrind cycle estimation
在进入他们的 github 页面并从他们的 kde 文档站点看到一些 pdf 手册后,我仍然感到困惑。假设一段测试代码中有这两行:
double a1 {asinh(1 / ep)}; // 5 instr.
double b1 {log((1 + sqrt(1 + ep*ep)) / ep)}; // 12 instr.
其中 ep
是一些可以预定义的值。评论是我的,在 Codeblocks 中由 运行 调试器和反汇编器完成,然后耐心地点击 "next instruction" 并计数。如果我将它设置为显示 "Instruction fetch",这些与 Kacachegrind 所说的相符。我想这应该是有道理的(顺便说一句,我是 C++ 的初学者)。但是如果我切换到 "Cycle estimation" 我会得到一些非常奇怪的读数。对于当前示例,它是 115
和 122
,但其他看似相似的表达式,如:
double Ap {1.0};
double ep {0.9};
显示 222
和 2
(instr.fetch 显示 2
两者)!这是怎么回事?有人可以解释一下吗?
我想我在多次点击并更加习惯 Kcachegrind 后找到了答案。总数"cycle estimation"使用这个公式:
CEst = Ir + 10 L1m + 100 LLm
哪里
Ir = Instruction Fetch
L1m = L1 Miss Sum
Llm = Last-level Miss Sum
所以,对于我的情况,CEst
显示 2
和 222
,但每个 2 Ir
,第一个有 2
指令获取和没有遗漏,而另一个有 2
指令获取,但也有两次未命中,=>
2*Ir + 10*2*L1m + 100*2*Llm = 2 + 20 + 200 = 222
这在我尝试过的所有代码中都是一致的。
kcachgrind 的当前源代码建议计算比其他答案稍微复杂:
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();
}
在进入他们的 github 页面并从他们的 kde 文档站点看到一些 pdf 手册后,我仍然感到困惑。假设一段测试代码中有这两行:
double a1 {asinh(1 / ep)}; // 5 instr.
double b1 {log((1 + sqrt(1 + ep*ep)) / ep)}; // 12 instr.
其中 ep
是一些可以预定义的值。评论是我的,在 Codeblocks 中由 运行 调试器和反汇编器完成,然后耐心地点击 "next instruction" 并计数。如果我将它设置为显示 "Instruction fetch",这些与 Kacachegrind 所说的相符。我想这应该是有道理的(顺便说一句,我是 C++ 的初学者)。但是如果我切换到 "Cycle estimation" 我会得到一些非常奇怪的读数。对于当前示例,它是 115
和 122
,但其他看似相似的表达式,如:
double Ap {1.0};
double ep {0.9};
显示 222
和 2
(instr.fetch 显示 2
两者)!这是怎么回事?有人可以解释一下吗?
我想我在多次点击并更加习惯 Kcachegrind 后找到了答案。总数"cycle estimation"使用这个公式:
CEst = Ir + 10 L1m + 100 LLm
哪里
Ir = Instruction Fetch
L1m = L1 Miss Sum
Llm = Last-level Miss Sum
所以,对于我的情况,CEst
显示 2
和 222
,但每个 2 Ir
,第一个有 2
指令获取和没有遗漏,而另一个有 2
指令获取,但也有两次未命中,=>
2*Ir + 10*2*L1m + 100*2*Llm = 2 + 20 + 200 = 222
这在我尝试过的所有代码中都是一致的。
kcachgrind 的当前源代码建议计算比其他答案稍微复杂:
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();
}