问题标签 [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.

0 投票
1 回答
4462 浏览

c++ - CPU周期计数c ++

可能重复:
使用 RDTSC 获取 cpu 周期 - 为什么 RDTSC 的值总是增加?
获取 CPU 周期数?

我想编写分析排序算法的 C++ 代码,并且我需要知道对数组进行排序需要多少个处理器周期。

关于如何做到这一点的任何建议?

我在这里找到了这段代码:

我知道它是内联汇编,有人可以解释它是如何工作的以及如何使用它吗?

我运行 Linux。我的电脑是双核的,有区别吗?

0 投票
4 回答
5553 浏览

cpu - 确定数据流中的关键路径

Computer Systems: A Programmer's Perspective一书中,练习 5.5 显示了一段代码来计算多项式的值

练习假设双精度浮点加法和乘法所需的时钟周期分别为 3 和 5。读者被要求解释为什么测量的 CPE(每个元素的循环数)值为 5。

根据练习答案,在每次迭代中,我们需要更新变量xpwr和最终的 CPE 为 5。resultresultxpwr

但我认为数据流应该是这样的:

所以最长的路径是从 的前一个值xpwr到 的新值result,经过执行单元[mul][add]。因此最长的时间应该是8个周期。

我想问一下

  1. 关键路径的确切含义是什么?以及如何确定?
  2. 哪个答案(我的和书)更合理?

任何关于 CPU、架构、执行单元、流水线、浮点单元的解释都将不胜感激。

0 投票
1 回答
728 浏览

assembly - 如何阅读ISA反汇编?还有 GPU 流水线和等待状态

我试图了解 OpenCL 编译器生成的机器代码以优化它。因此,我使用工具 m2s-opencl-kc(来自 multi2sim)离线编译我的 *.cl 文件并将中间文件(开关:-a)保留为 *.isa 文件。这个 *.isa 包含一个“反汇编”部分,这似乎是我正在寻找的......

注意:我的组装知识有点“老”。我为 Pentium 386/486 CPU 等老款 CPU 制作了组件。所以我实际上在阅读矢量指令时遇到了问题,而我对它们有一些理论知识。

我想知道的是命令前面的数字和字符的含义。据我了解,编译器产生了一些“复杂”的指令:

(问题:那是所谓的“非常长的指令词”吗?)

而这个“复杂”指令由多个“简单”指令组成:

这些“简单”的指令似乎是每个向量单元的指令。四个向量单元由 x、y、z 和 w 引用。但什么是“不”?那是另一个向量单位吗?我为“赛普拉斯”GPU编译了它......

现在关于数字......这些就像“行号”吗?前导零:复杂指令序列号...?无前导零:简单指令序列号...?

如果我们假设内存访问没有等待状态,我假设所有具有相同序列的“简单”指令都可以在一个周期内“逻辑地”执行。例如,以下指令(上述复杂指令的)在周期 0 中“执行”:

“已执行”是指我们有某种(例如 4 周期)流水线。这意味着上述指令应该在周期 0 开始执行,并且应该在周期 3 之后完成。

关于流水线的问题

如果下一条指令(例如“1”)读取寄存器 R2.x 会发生什么?那会读取 R2.x 的旧值(在指令“0”之前)还是会延迟指令“1”,直到指令“0”完成?或者这可能是编译器必须注意的“不关心”情况(产生未定义的结果),这种情况永远不会发生?

关于内存访问的问题

我假设可以在数据获取周期期间执行对寄存器的访问,而无需等待。内存访问将需要一些额外的周期,具体取决于访问的内存类型:

  • “__private”内存应该主要映射到寄存器。
  • __local memory(最多 64KB 在同一组的工作项之间共享):在当前的 GPU 中我需要多少额外的周期?
  • __global memory:这应该是例如 256MB 到 x GB 的外部 DRAM。我在这里需要多少额外的周期?据我所知,此内存没有为 GPU 设备缓存。
  • __constant 内存应该类似于 __global 内存,但使用 __local 内存进行缓存

“ISA”有什么好的教程吗?

问候,斯特凡

0 投票
1 回答
1882 浏览

c++ - 如何获得足够精确的时间戳以在每次获取时都不同?

要生成全局唯一 ID,我需要它们创建的时间戳之类的东西。但是这些 id 可以在源代码中直接生成。所以以毫秒为单位的时间不够准确,可能会无意中产生相同的 id。

因此,我需要一个足够精确的时间戳,以便每次获取它时都会有所不同。我虽然关于 CPU 周期,但我不知道是否有办法获取这些信息。

由于这是针对实时游戏的,因此获取时间戳与性能相关。而且,它是跨平台兼容Linux、Windows和Mac的,所以时间戳当然也应该是。如果没有标准的方法,我可以接受三种不同的系统解决方案。

0 投票
1 回答
1089 浏览

caching - 了解 CPI 和缓存访问

这些是以前的家庭作业问题,但我将它们用作考试复习。我正在改变实际问题中的数字。我只是想确保我掌握了这些概念。我已经有了答案,只需要澄清一下我理解它们。这不是家庭作业,而是复习作业。

无论如何,这集中在CPI的各个方面

拳头问题:

在 1GHz 处理器上运行的应用程序具有 30% 的加载存储指令、30% 的算术指令和 40% 的分支指令。单独的 CPI 是 3 用于加载存储,4 用于算术,5 用于分支指令。确定该程序在给定处理器上的总体 CPI。

我的回答:总体 CPI 是子 CPI 的总和,乘以它们出现的百分比,即 3*0.3 + 4*0.3 + 5*0.4 = 0.9 + 1.2 + 2 = 4.1

现在,处理器得到了增强,可以在 1.6GHz 下运行。分支指令的 CPI 保持不变,但加载存储和算术指令的 CPI 都增加到 6 个周期。正在使用一种新的编译器,它消除了 30% 的分支指令和 10% 的加载存储。确定新的总体 CPI 以及应用程序更快或更慢的因素。

我的回答:再一次,新的 CPI 只是各个部分的总和。但是,零件已经发生了变化,必须考虑到这一点。分支指令将下降 30% (0.4*0.7=0.28),加载存储将下降 10% (0.3*0.9=0.27);算术指令现在将占其余指令 (1-0.28-0.27=0.45),即 45%。这些将乘以新的子 CPI 得到:6*0.45+6*0.27+5*0.28=5.72。

现在,处理器增强速度提高了 60%,CPI 提高了 (5.72-4.1)/4.1 = 39.5%。因此,应用程序的运行速度大约会提高 0.6*0.395 = 23.7%。

现在,第二个问题:

具有加载/存储架构的新处理器的理想 CPI 为 1.25。该处理器上的典型应用是 50% 算术和逻辑、25% 条件分支和 25% 加载/存储的混合。内存通过单独的数据和指令高速缓存访​​问,指令高速缓存未命中率和数据未命中率分别为 5% 和 10%。任何高速缓存未命中的惩罚是 100 个周期,并且命中不会产生任何惩罚。

什么是有效CPI?

我的回答:有效的 CPI 是理想的 CPI,加上由于缓存访问而导致的每条指令的停滞周期。给定的理想 CPI 为 1.25。每条指令的停滞周期为 (0.1*100*0.25) + (0.05*100*1) = 7.5。0.1*100*0.25 是数据未命中率乘以停滞周期损失,后者还乘以加载/存储百分比(数据访问发生的地方);0.05*100*1 是指令未命中率,即指令缓存未命中率乘以停顿周期惩罚,指令访问发生在 100% 的程序中,因此乘以 1。由此得出有效 CPI 为1.25 + 7.5 = 8.75。

典型应用程序每 1000 条指令的未命中率是多少,典型应用程序的平均内存访问时间(时钟周期)是多少?

我的答案:每 1000 条指令的未命中等于由于缓存访问而导致的每条指令的停顿周期(如上所示:7.5)除以 1000,等于 7.5/1000 = 0.0075

在讨论平均内存访问时间(AMAT)时,我们首先要说这里的访问总数,即数据访问的百分比(25%)加上指令访问的百分比(100%),即125%=1.25 . 数据访问为 .25/1.25,指令访问为 1/1.25。

AMAT 等于数据访问百分比 (.25/1.25) 乘以命中时间 (1) 和数据未命中率乘以未命中惩罚 (0.1*100) 的总和,即 (.25/1.25)(1 +0.1*100) 并将其添加到指令访问百分比 (1/1.25) 乘以命中时间 (1) 和指令未命中率乘以未命中惩罚 (0.05*100) 的总和,或 (1 /1.25)(1+0.05*100)。综上所述,AMAT 为 (.25/1.25)(1+0.1*100)+(1/1.25)(1+0.05*100)=7。

再次为文字墙感到抱歉。如果我错了,请尝试帮助我理解错了。我试图展示我所有的作品,以使其尽可能容易理解。提前致谢。

0 投票
1 回答
282 浏览

time - 使用 CPU 时钟测量时间的问题

我知道在各种操作系统上使用 CPU 时钟计数器获取时间增量的标准方法。我的问题是,这样的操作系统如何考虑 CPU 频率的变化以达到省电的目的。我最初认为这可以基于操作系统使用特定调用来测量频率以根据正在使用的内核、当前设置的频率等来获得校正频率的事实来解释。但后来我意识到,不是吗?如果 CPU 频率在两个时钟查询之间降低并恢复到其原始值,则使任何时间增量不准确。

例如采取以下场景:

查询 CPU 周期。操作系统会降低 CPU 频率以节省电量。其他一些代码在这里运行。操作系统提高 CPU 频率以提高性能。查询 CPU 周期。将 delta 计算为周期差除以频率。

这将产生不准确的增量,因为两个查询之间的 CPU 频率不是恒定的。操作系统或必须使用 CPU 周期处理时间增量的程序如何解决这个问题?

0 投票
1 回答
177 浏览

c# - 是否可以睡一定数量的周期

我想知道是否有可能让线程休眠一定数量的 CPU 周期?

我想过只插入“nop”,但我不确定它们是否得到优化,我希望有一个高级解决方案。

有什么好东西可以推荐给我吗?如果不能,我可以防止手动插入的“nop”在不禁用所有优化的情况下得到优化吗?亲切的问候

卢卡斯·海弗利格

编辑:作为另一个问题:是否可以测量某个代码片段在执行期间所需的周期数?

0 投票
3 回答
6440 浏览

c - 哪个操作需要更多的 CPU 时钟,取模还是比较?

哪个操作需要更多CPU时钟,modulo还是comparison

此代码是否需要更多时间:

或这个

为什么?

0 投票
2 回答
1832 浏览

c++ - 如何在 Windows 上获取内核模式下进程使用的 CPU 时钟周期?

正如标题所示,我只对获取内核模式下进程使用的 CPU 时钟周期感兴趣。我知道有一个名为“QueryProcessCycleTime”的 API,它返回进程线程使用的 CPU 时钟周期。但是这个值包括在用户模式和内核模式下花费的周期。如何获得仅在内核模式下花费的周期?我需要使用性能计数器来获得这个吗?如果是,我应该使用哪一个?

提前感谢您的回答。

0 投票
1 回答
2113 浏览

instructions - 执行 MOV A, 5 指令需要多少 cpu 周期

我的问题是计算执行 MOV A, 5 指令需要多少 CPU 周期。分别描述。

谁能解释一下这是如何工作的。而5是一个值是吗?给我解释一下要点。

我所知道的,

首先, -
从内存中获取指令(一个时钟周期) - 更新
指令指针(一个时钟周期)
- 解码指令以查看它的作用(一个时钟周期)

我被困在这之后。