- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在分析一个应用程序在运行 Linux 的 x86-64 处理器上的执行时间。在开始对应用程序进行基准测试之前,我想确保禁用动态频率缩放和空闲状态。
$ cat /sys/devices/system/cpu/cpufreq/boost
0
这告诉我频率缩放(Intel 的 Turbo Boost 或 AMD 的 Turbo Core)被禁用。事实上,我们将其设置为恒定的 2GHz,这在下一个练习中很明显。
$ cpupower --cpu 0-63 idle-info
CPUidle driver: none
CPUidle governor: menu
analyzing CPU 0:
CPU 0: No idle states
analyzing CPU 1:
CPU 1: No idle states
analyzing CPU 2:
CPU 2: No idle states
...
因此,空闲状态被禁用。现在我确定可以干扰基准标记的两个“功能”都已禁用,我继续使用 cpupower 监视应用程序。
但是,当我运行用于监视 C 状态的应用程序时,我发现超过 99% 的时间花在了 C0 状态上,这应该是这种情况。但是,我还看到了一种叫做 Cx 状态的东西,其中核心花费 0.01 - 0.02% 的时间。
$ cpupower monitor -c ./my_app
./my_app took 32.28017 seconds and exited with status 0
|Mperf
CPU | C0 | Cx | Freq
0| 99.98| 0.02| 1998
32| 99.98| 0.02| 1998
1|100.00| 0.00| 1998
33| 99.99| 0.01| 1998
2|100.00| 0.00| 1998
34| 99.99| 0.01| 1998
3|100.00| 0.00| 1998
35| 99.99| 0.01| 1998
...
所以,很高兴了解以下内容。
奖励问题
CPUidle driver: none
是什么意思?编辑 1
关于基准测试期间其他问题的第二个问题,我最近发现 CPU 内核上用于调度目的的本地定时器中断可能会影响测量结果,因此 CONFIG_NO_HZ_FULL在 Linux 内核中启用以启用 tickless 模式
最佳答案
开源软件的美妙之处在于你可以随时去检查:)cpupower monitor
使用不同的监视器,mperf
monitor defines this array :
static cstate_t mperf_cstates[MPERF_CSTATE_COUNT] = {
{
.name = "C0",
.desc = N_("Processor Core not idle"),
.id = C0,
.range = RANGE_THREAD,
.get_count_percent = mperf_get_count_percent,
},
{
.name = "Cx",
.desc = N_("Processor Core in an idle state"),
.id = Cx,
.range = RANGE_THREAD,
.get_count_percent = mperf_get_count_percent,
},
{
.name = "Freq",
.desc = N_("Average Frequency (including boost) in MHz"),
.id = AVG_FREQ,
.range = RANGE_THREAD,
.get_count = mperf_get_count_freq,
},
};
从逻辑上讲,Cx
表示任何 C 状态而不是 C0
,即 任何空闲状态(请注意,这些状态不是 ACPI 状态, 虽然数字越大 sleep 状态越深 - 对于 ACPI 关闭是 C6)。
注意如何 Cx
is computed :
if (id == Cx)
*percent = 100.0 - *percent;
Cx
只是 C0
的补集。
这是因为 IA32_M/APERF
使用的计数器不在任何 C 状态下计数,但 C0
:
C0 TSC Frequency Clock Count
Increments at fixed interval (relative to TSC freq.) when the logical processor is in C0.A similar definition for
IA32_APERF
is present in the manuals.
进行基准测试时需要考虑很多事情,可能比作为次要答案列出的要多。
通常,稍后运行的测试代码会发现缓存中至少有一部分数据是热数据(对于 TLB 和任何内部缓存也是如此)。
根据基准测试程序,中断亲和性也是需要考虑的因素。
但是我要说的是,在禁用涡轮增压和缩放功能的情况下,您已经准备好进行测试了。
CPUIdle 驱动程序是内核的一个组件,用于控制进入和退出空闲状态的平台相关部分。
对于 Intel CPU(和 AMD 的?),内核可以使用 ACPI processor_idle驱动程序(如果 enabled )或 intel_idle (使用 mwait
)。
关于linux - cpupower monitor中的C-state Cx是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54438430/
NASM给出的错误(尽管我的操作系统正常)是“无效的有效地址”。 现在,我已经看到了许多关于如何使用LEA的示例,我认为我做对了,但是我的NASM不喜欢它。我尝试了lea cx, [cx+9]并成功了
我希望尽可能生成动态文本而不需要创建 webhook。我知道创建动态文本的唯一方法是根据参数创建不同的路由或通过 using inline system functions像文本实现中的 $sys.f
我需要知道如何查看实际对话以及与每个对话回合匹配的意图。 我在 上找不到完成对话/意图审查的方法Dialogflow CX 版。 (在 ES 版上非常简单)。 我需要访问他的功能(如果它在 CX 上实
我正在尝试填充 API 参数:https://cloud.google.com/dialogflow/cx/docs/quick/api . 我找不到任何关于如何在其文档中找到代理 ID 的引用:ht
我正在尝试填充 API 参数:https://cloud.google.com/dialogflow/cx/docs/quick/api . 我找不到任何关于如何在其文档中找到代理 ID 的引用:ht
我正在探索 Cx,这是一个基于 React ( http://cx.codaxy.com/ ) 的有趣的新框架,但我不知道如何访问组件内的 DOM 元素. 基本上,我有一个包含一些文本和一个按钮的简单
我是 WinRT 的新手。我正在将用 C++/CX 编写的 Windows UWP 应用程序转换为 C++/WinRT。我有一个 C++/CX ref 类,它基本上与 C# 中的 Microsoft.
每当我尝试在 DOSBox 下使用 MASM 6.15 时: mov al, [cx] 或者 mov al, [cx + bx] 或者 mov al, [cx + 4] 我收到错误消息:“只允许使用基
我想在 CDialog 的 OnInitDialog 期间获取 cx 和 cy。 我可以用下面的代码做到这一点: myDialog::OnInitDialog() { CRect rcWindow
这听起来像是一个愚蠢的问题,因为我知道这两种语言的实现是完全不同的。但是,我对细节有些不清楚。 我喜欢的 C++CLI 中一个非常好的特性是我可以拥有一个标准的 C# .NET 动态库并在 C++CL
我正在尝试使用 RPC DetectIntent 方法与 Dialogflow CX 代理交互,但出现错误“请切换到‘us-east1-dialogflow.googleapis.com’以访问位于‘
我有一个类: ref class Coord { public: property float X { float get() { return X; } vo
我是 C++/CX、IDL 和 WRL 的新手,遇到了一个问题我不确定是我的代码有错误还是设计的限制。 我有一个 IDL,它定义了一个 IInspectable 接口(interface)及其运行时类
我正在通过构建 Windows 应用商店应用来学习 C++/CX。对于我的 View 模型的基础,我使用标准的 BindableBase 类并向其添加了一个方便的 SetProperty 方法(我在我
我最近加入了一家新公司,并且是 python(他们首选的脚本语言)的新手,并且一直在使用 cx_oracle 创建一些 ETL 流程。到目前为止,我构建的脚本都是单线程作业,它们从 Oracle 源数
java.util.regex.Pattern 的 Javadoc 说 \cx 表示 x 对应的控制字符。所以我认为 Pattern.compile() 会拒绝 \c 后跟除 [@-_] 之外的任何字
我想使用 C++/CX 语法编写一个库并在其他项目中使用它。 如您所知,普通的旧数据结构不能有任何方法或运算符,因此我们不得不做一些事情,例如在另一个类中编写静态方法来提供行为。 我们也不能这样写代码
我正在尝试使用以下汇编代码将磁盘扇区加载到内存中,但正如我在终端中使用一些 int 0x10 时发现的那样,它不起作用的原因是它陷入了无限循环。我以为循环会自动为我递减 cx 寄存器。下面是代码,其中
我关注了this tutorial用于在 Mac 上安装 cx_oracle。经过一些调整,它成功了。我之前使用的是 Mavericks。然后我升级到 El Capitan。这就是灾难的来源。 它停止
我一直在学习x86汇编语言,PUSHA指令产生了一个问题。 据我所知,Pusha和PUSH AX, CX, DX, BX, original SP, BP, SI, DI一样。 我想知道的是为什么在
我是一名优秀的程序员,十分优秀!