问题标签 [cpu-cycles]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 当 TscInvariant = True 时如何计算周期?
rdtsc
如果启用了“TscInvariant”CPUID 功能,则该命令应该是可靠的时间来源(例如,请参见此链接)。在动态频率重新缩放上下文中,可靠的时间源不能是可靠的周期源。
在启用 TsCInvariant 的 CPU 上:有没有一种可靠的方法来测量周期?
c - 为什么 nop 不占用一个时钟周期
我编写了一个基本代码来找出 nop 占用的时钟周期数。我们知道 nop 需要一个时钟周期。
但输出不是1。
有时是 14 或 16。
我可以知道这背后的原因吗?我有什么遗漏吗
assembly - 在给定执行时间、指令计数和时钟速率的情况下计算每条指令的平均周期
所以我正在学习计算机体系结构,我们必须考虑不同的处理器及其时钟,我不禁觉得在计算平均 CPI 时我的计算是错误的。对于一个这样的过程,我得到:
- 指令计数为 1.0E9
- 编译器 A 的程序执行时间为 1.5s
- 处理器的时钟频率为 8.0E9 Hz。
我修改后的方程是CPI = (Execution Time * Clock Rate)/Instruction Count
。
插入这些值,我得到编译器 A 程序的平均 CPI 为 12。但是,这比其他练习题要高得多。我想知道我的计算是否正确,如果正确,为什么CPI这么高?
c - CPU 使用率 C Packed struct vs Unsigned Long Long 操作
我需要对 48 位变量进行一些操作,所以我有两个选择:
- 使用 48 位变量创建我自己的结构,或
- 使用unsigned long long(64 位)。
由于操作不会溢出 48 位,我认为使用 64 位变量是一种矫枉过正,所以我创建了一个基本结构
并创建了一些代码来检查操作的速度
但我得到了以下结果
因此,使用unsigned long long的操作比使用打包结构的操作花费的时间更少。
- 这是为什么?
- 那么使用unsigned long long会更好吗?
- 有没有更好的方法来打包结构?
由于我现在正在展开循环,因此使用正确的数据结构可能会显着影响我的应用程序的性能。
谢谢你。
performance - invlpg 指令的时钟周期
我正在阅读一些关于英特尔奔腾处理器指令的文档invlpg
,它说它需要 25 个时钟周期。我认为这取决于实现(特定的 CPU)而不是实际的指令集架构?还是该指令必须花费 25 个时钟周期才能运行的事实也是指令集规范的一部分?
cpu-architecture - 决定 CPU 周期时间的因素
我想知道 CPU 周期时间和流水线深度之间是否存在关系。我一直认为CPU周期时间完全由CPU频率决定(与频率相反)。然而,这个视频提到,随着流水线阶段的数量增加,可以减少周期时间,因为每个周期我们每个阶段的工作量都会减少。那么究竟是什么决定了 CPU 的周期时间:频率还是流水线中的阶段数?或者我们可以说管道深度会影响频率吗?
assembly - 为什么运行 NEON 内联汇编代码的测量时间与基于时钟周期数和内核频率的预期时间不匹配?
每次迭代大约 25 个时钟周期 每个图像 125 000 * 25 = 3 125 000 个周期
我在 ARM NEON 内联汇编中实现了示例代码(代码没有意义)。有(大约,我使用了来自 ARMv7 的信息,这是 ARMv8,但我不希望这个数字会更高)每个整个图像有 3,1M 个时钟周期。
我在频率为 1Ghz 的处理器上运行。如果处理器每秒执行 1G 个时钟周期,它应该在 4ms 内完成 3,1M 个周期。但我测量的时间约为 14 毫秒。
为什么不匹配?没有其他进程在同一核心上运行。
有条件分支,对于每次迭代(bne),它们将导致需要重新填充管道。如果条件跳过将被删除,而不是它,将编写数千行长的代码,它会快 3-4 倍吗?谢谢
cpu-architecture - 是否可以通过软件更改 CPU 的循环计数?
在典型的计算机系统中,是否可以手动将 CPU 周期计数器更改为特定值?最明显的方法是检查计数器值,然后运行 NOP 或其他冗余指令,直到该值符合要求,但如果所需值与当前值相距很远,这可能需要不可行的时间 - 我是寻找更现实的东西。
我怀疑大多数架构会包含执行此操作的指令,但是(也许因为答案很明显)我在其他地方找不到明确的答案。
c - 当程序从终端运行时,clock_gettime 需要更长的时间来执行
我试图测量一段代码的时间,并注意到当我从编辑器 QtCreator 中运行程序时,与从 gnome 终端中启动的 bash shell 运行程序相比,时间快了大约 50ns。我正在使用 Ubuntu 20.04 作为操作系统。
一个重现我的问题的小程序:
从 QtCreator 中运行时的输出
在终端内从我的 shell 运行时:
我尝试过但没有任何影响的事情
- 让 QtCreator 在终端中启动程序
- 使用 rdtsc 和 rdtscp 调用而不是 clock_gettime(运行时的相对差异相同)
- 通过在终端下运行从终端清除环境
env -i
- 使用 sh 而不是 bash 启动程序
我已经验证在所有情况下都调用了相同的二进制文件。我已经验证在所有情况下程序的 nice 值都是 0。
问题
为什么从我的 shell 启动程序会有所不同?关于尝试什么的任何建议?
更新
如果我在 main 的开头添加一个 sleep(1) 调用,QtCreator 和 gnome-terminal/bash 调用都会报告更长的执行时间。
如果我在 main 的开头添加了一个 system("ps -H") 调用,但删除了前面提到的 sleep(1):两个调用都报告了较短的执行时间(~20 ns)。
profiling - 使用 Pintool 跟踪 CPU 周期?
我正在尝试使用 Pintool 运行 SPEC17 基准测试。这样做时,我需要记录 CPU 周期和访问的内存地址。Pintool 有 pinatrace 工具来记录内存地址,但我找不到任何东西来记录 CPU 周期。有没有办法这样做?