- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Instrument 的时间分析器分析了我的代码,并放大了反汇编,这是其结果的片段:
我不希望 mov
指令占用 23.3% 的时间,而 div
指令采取几乎没有。
这让我相信这些结果是不可靠的。
这是真的吗?还是我只是遇到了 Instruments 错误?或者我需要使用一些选项来获得可靠的结果吗?
有没有关于这个问题的引用资料?
最佳答案
首先,可能有些计数确实属于 divss
正在向以后的指示收费,which is called a "skid" . (有关更多详细信息,另请参阅该评论线程的其余部分。)大概 Xcode 类似于 Linux perf
,并使用固定的 cpu_clk_unhalted.thread
专柜cycles
而不是可编程计数器之一。这不是“精确”事件 (PEBS),因此可能会打滑。 As @BeeOnRope points out ,您可以使用每个周期滴答一次的 PEBS 事件(如 UOPS_RETIRED < 16
)作为固定周期计数器的 PEBS 替代品,从而消除对中断行为的一些依赖。
但是计数器从根本上用于流水线/乱序执行的方式也解释了您所看到的大部分内容。或者它可能;你没有显示完整的循环,所以我们不能像 IACA 那样在一个简单的管道模型上模拟代码,或者手动使用硬件指南,如 http://agner.org/optimize/和英特尔的优化手册。 (而且您甚至还没有指定您拥有什么微体系结构。我猜它是 Mac 上英特尔 Sandybridge 系列的某个成员)。
计数 cycles
通常对等待结果的指令收费 ,通常不是产生结果很慢的指令。 在您尝试读取尚未准备好的结果之前,流水线 CPU 不会停止。
乱序执行使这一点变得非常复杂,但是当有一条非常慢的指令时,通常仍然如此,例如经常在缓存中未命中的加载。当cycles
计数器溢出(触发中断),有许多指令在运行,但只有一个可以是与该性能计数器事件关联的 RIP。它也是中断后恢复执行的 RIP。
那么当中断发生时会发生什么?见 Andy Glew's answer关于这一点,它解释了英特尔 P6 微体系结构管道中性能计数器中断的内部原理,以及为什么(在 PEBS 之前)它们总是被延迟。 Sandybridge-family 在这方面类似于 P6。
我认为英特尔 CPU 上的性能计数器中断的合理心理模型是它丢弃任何尚未被分派(dispatch)到执行单元的微指令。但是已经被分派(dispatch)的 ALU uop 已经通过管道退出(如果没有任何年轻的 uop 被丢弃)而不是被中止,这是有道理的,因为 sqrtpd
的最大额外延迟约为 16 个周期。 ,并且刷新存储队列很容易花费比这更长的时间。 (已经退休的挂起商店不能回滚)。关于尚未退役的负载/存储的 IDK;至少负载可能会被丢弃。
我的猜测是基于这样一个事实,即很容易构建不显示 divss
的任何计数的循环。当 CPU 有时等待它产生输出时。如果它在没有退出的情况下被丢弃,它将是恢复中断时的下一条指令,因此(除了skids)您会看到很多计数。
因此, cycles
的分布counts 显示哪些指令花费最多时间是调度程序中最旧的尚未调度的指令 . (或者在前端停顿的情况下,CPU 尝试获取/解码/发出哪些指令时停顿)。请记住,这通常意味着它会向您显示正在等待输入的指令,而不是生成它们的指令很慢。
(嗯, 这可能不正确 ,我还没有测试这么多。我通常使用 perf stat
在微基准测试中查看整个循环的总体计数,而不是使用 perf record
的统计配置文件. addss
和 mulss
的延迟高于 andps
,所以如果我建议的模型是正确的,你会期望 andps
获得等待其 xmm5 输入的计数。)
总之,普遍的问题是,一次执行多个指令,当 cycles
时,哪个是硬件“责备”柜台环绕?
请注意 divss
产生结果很慢,但只是一个单 uop 指令(与整数 div
不同,后者在 AMD 和 Intel 上微编码)。如果您没有在延迟或未完全流水线化的吞吐量方面遇到瓶颈,it's not slower than mulss
因为它也可以与周围的代码重叠。
( divss
/divps
不是完全流水线化的。例如在 Haswell 上,一个独立的 divps
可以每 7 个周期启动一次。但每个只需要 10-13 个周期来产生它的结果。所有其他执行单元都是完全流水线化的;能够在每个周期对独立数据开始新的操作。)
考虑一个大循环,它对吞吐量造成瓶颈,而不是任何循环携带的依赖项的延迟,并且只需要 divss
每 20 条 FP 指令运行一次。使用 divss
由一个常量代替 mulss
与倒数常数应该(几乎)没有性能差异。 (实际上,乱序调度并不完美,即使没有循环执行,更长的依赖链也会对某些人造成伤害,因为它们需要更多的指令在运行以隐藏所有延迟并维持最大吞吐量。即对于输出-of-order 核心以找到指令级并行性。)
无论如何,这里的重点是divss
是一个单一的 uop 并且它没有为 cycles
获得很多计数是有意义的。事件,取决于周围的代码。
您会看到缓存未命中加载的相同效果:加载本身通常仅在必须等待寻址模式中的寄存器时才获得计数,并且依赖链中使用加载数据的第一条指令获得大量计数.
您的个人资料结果可能告诉我们什么 :
divss
不必等待其输入准备就绪。 (movaps %xmm3, %xmm5
之前的 divss
有时需要一些周期,但 divss
永远不会。) divss
的吞吐量上接近瓶颈xmm5
的依赖链之后 divss
正在得到一些计数。乱序执行必须同时保持多个独立迭代。 maxss
/movaps
循环携带的依赖链可能是一个重要的瓶颈。 (特别是如果您在 Skylake 上,其中 divss
吞吐量是每 3 个时钟一个,但 maxss
延迟是 4 个周期。端口 0 和 1 的资源冲突将延迟 maxss。)movaps
的高计数可能是由于以下
maxss
,在您显示的循环部分中形成唯一的循环携带依赖项。因此,
maxss
是合理的产生结果确实很慢。但如果它真的是一个循环承载的 dep 链是主要瓶颈,你会期望在
maxss
上看到很多计数。本身,因为它将等待上次迭代的输入。
movaps
?在 Ivybridge 和更高版本的 CPU 上,
register copies doesn't need an execution unit, but instead are handled in the issue/rename stage of the pipeline .
关于xcode - Xcode Instrument 的反汇编时间分析的可靠性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369347/
我正在观看来自 iTunes U. 的视频讲座,其中讲师展示了如何使用 Xcode 的调试器部分并能够将该窗口从主窗口拉开。 不幸的是,视频显示了如何在 Xcode3 中执行此操作的说明。如何在 Xc
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
我真的厌倦了其他用户的项目错误,因为 XCode 的默认类引用类型是“相对于 XCode 文件夹”。我知道您可以将其更改为“相对于封闭组”,这就是我们的项目,但是任何时候有人创建一个新的类文件并且忘记
我对 Xcode 一无所知,除了它是来自 Apple 的开发人员界面,它实际上来自 OSX CD,它也用于创建 iPhone 应用程序。 我也知道它有一个 Applications 文件夹,里面装满了
更新 Xcode(从 7.2 到 7.2.1)后,XcodeServer 无法运行 Xcode Service。当我选择更新的 Xcode 时,提示消息:Enable Accessibility ac
我很难找到有关新 XCode 布局的信息。如何查看源文件的反汇编,而不仅仅是 C++ 代码? 最佳答案 在 Xcode 4.2(和 Xcode 5)中,您可以通过以下方式查看文件的汇编或反汇编: 显示
我在 XCode 中为我的项目添加了一个文件夹并将其命名为 Themes,它将用于存储我的 iPad 应用程序的主题。在那下面我有红色、蓝色等等。 它们出现在 XCode 中。但是当我查看物理文件夹时
作为我之前 How can I create a reference cycle using dispatchQueues? 的后续: 对于强引用(会造成泄漏,但不是循环引用),例如Timer、Dis
我有一台 macbook air,我去商店安装 Xcode 7.3 并点击更新 App 按钮,然后出现了一个加载图标,但等待 30 分钟后什么也没发生。我从商店成功安装了 simple recorde
我的项目现在有一个project.xcworkspace/xcshareddata目录。 Xcode在project.xcworkspace/xcshareddata目录中存储什么? 最佳答案 xcs
我不经常使用 XCode 进行开发,最近 MacPorts 告诉我我需要获得 3.1 才能使包工作。我去了苹果,他们为我提供了最新版本,结果只适用于 OSX 6。因为我有 OSX 5,它对我没有任何帮
有谁知道如何强制 Xcode 停止运行。我更新到 6.2 但现在它不能正常工作。我需要退出 Xcode 才能完成更新或卸载并重新安装。菜单中的相当 Xcode 不可用。无法将其拖到垃圾箱,因为它说它仍
我最近从我的项目中删除了一些旧的测试类并删除了文件。正如预期的那样,文件被移到垃圾箱并在 git 中显示为已删除。 不幸的是,测试类和它们定义的测试用例继续出现在测试导航器中。我已经尝试过常见的疑点,
Xcode 中的场景编辑器显示大小但不显示单位。它是以英寸为单位的尺寸还是以米为单位的尺寸? 例如,当我选择一个节点时,例如一个盒子,当我在节点检查器中检查它的属性并在“边界框”旁边的“变换”部分检查
只想知道 xcode 项目中事件可执行文件的目的是什么? 谢谢 索拉布 最佳答案 自己找到了..希望它会帮助某人。 您可以在其中运行和测试软件产品的可执行环境。可执行环境定义了应该用来运行产品的程序。
刚回到我的办公 table ,Xcode 一直在文件中突出显示/强调空白区域。如果我输入一些东西它就会消失,但如果我切换标签并回来,它们会重新出现。 更新:这不是由“显示隐形”选项引起的。那看起来不一
我首先注意到这一点 Cmd-/偶尔拒绝为注释取消注释的代码行工作。但是现在(刚刚使用 XCode 4.1,虽然这可能无关)它发生在 Cmd-B建立。 我无法弄清楚我正在做什么导致这种情况,或者是否有任
我不太了解Xcode 4的工作区的实用程序。它们的用途是什么,它们如何帮助Xcode进行开发? 最佳答案 例如。您有一个在两个应用程序中使用的库。您很可能为此库拥有一个自己的项目,对吗?现在,您可以自
我正在关注一个应用程序教程,它说: “接下来,在 Xcode 应用程序项目目录的根目录下创建一个空文件,并调用该文件 Podfile。使用您喜欢的文本编辑器打开它,然后在其中粘贴以下行:” 我很困惑这
我是一名优秀的程序员,十分优秀!