当前位置: 首页 > 知识库问答 >
问题:

intel Intrinsic中的延迟与吞吐量

谭建章
2023-03-14

总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解。但是,对于Intel Intrinsics,延迟对指令吞吐量的影响我还不清楚,尤其是在顺序(或几乎顺序)使用多个内在调用时。

例如,让我们考虑:

_mm_cmpestrc

这有11个延迟,在Haswell处理器上的吞吐量为7。如果我在循环中运行这条指令,我会在11个循环后获得每个循环的连续输出吗?由于这需要一次运行11条指令,并且由于我的吞吐量为7,我是否用完了“执行单元”?

我不知道如何使用延迟和吞吐量,只是想了解一条指令相对于不同版本的代码需要多长时间。

共有1个答案

夹谷晋
2023-03-14

有关CPU性能的更完整信息,请参阅Agner Fog的微体系结构指南和指令表。(他的优化C和优化装配指南也很优秀)。另请参阅x86标记wiki中的其他链接,特别是Intel的优化手册。

另请参见

>

  • 每个汇编指令需要多少CPU周期?

    在预测现代超标量处理器上操作的延迟时,需要考虑哪些因素?如何手动计算?有关使用指令成本数字的更多详细信息。

    计算某个位置或更低位置的设定位的有效方法是什么?例如,根据前端UOP、后端端口和延迟分析asm的短序列。

    对于混合使用向量指令的循环,单个指令的延迟和吞吐量实际上不足以获得有用的图片。这些数字不能告诉您哪些内部函数(asm指令)在吞吐量资源方面相互竞争(即它们是否需要相同的执行端口)。它们仅适用于超级简单的循环,例如加载/执行一件事/存储,或使用\u mm\u add\u ps\u mm\u add\u epi32对数组求和。

    您可以使用多个累加器来获得更多的指令级并行性,但您仍然只使用一个内在函数,因此您确实有足够的信息可以看到,例如Skylake之前的CPU每个时钟只能维持一个_mm_add_ps的吞吐量,而SKL每个时钟周期可以启动两个(互惠吞吐量为每0.5c一个)。它可以在其两个完全流水线的FMA执行单元上运行ADDPS,而不是只有一个专用的FP-add单元,因此吞吐量更好,但延迟比Haswell更差(3c lat,每1c tput一个)。

    由于Skylake上的mm\U add\U ps延迟为4个周期,这意味着可以同时执行8个矢量FP add操作。因此,您需要8个独立的向量累加器(在末尾相互添加)来公开这么多的并行性。(例如,使用8个单独的变量手动展开循环。编译器驱动的展开(使用<代码>-funroll循环-ffast math编译)通常会使用相同的寄存器,但循环开销不是问题)。

    这些数字还忽略了英特尔CPU性能的第三个主要维度:融合域uop吞吐量。大多数指令解码为单个uop,但有些解码为多个uop。(尤其是SSE4.2字符串指令,如您提到的_mm_cmpestrc:PCMPESTRI在Skylake上是8个uops)。即使任何特定的执行端口都没有瓶颈,您仍然可以在前端保持无序内核有工作要做的能力上遇到瓶颈。英特尔Sandybridge系列CPU每个时钟最多可以发出4个融合域uops,并且在实践中,当其他瓶颈不发生时,通常可以接近这个速度。(请参阅执行uop计数不是处理器宽度倍数的循环时性能会降低吗?对于不同循环大小的一些有趣的最佳情况前端吞吐量测试。)由于加载/存储指令使用与ALU指令不同的执行端口,这可能是L1缓存中数据热时的瓶颈。

    除非您查看编译器生成的asm,否则您将不知道编译器必须使用多少额外的MOVDQA指令在寄存器之间复制数据,以解决没有AVX的情况下,大多数指令都会用结果替换其第一个源寄存器这一事实。(即破坏性目的地)。您也不知道循环中任何标量操作的循环开销。

    我想我已经很好地理解了延迟和吞吐量之间的区别

    你的猜测似乎没有意义,所以你肯定错过了什么。

    CPU是流水线的,内部的执行单元也是流水线的。“完全流水线”执行单元可以在每个周期启动一个新操作(吞吐量=每个时钟一个)

    >

    延迟是一个操作的结果准备就绪所需的时间,通常只有当它是循环承载的依赖链的一部分时才起作用。

    如果循环的下一次迭代独立于前一次迭代运行,那么无序执行可以“看到”足够远的前方,以找到两次迭代之间的指令级并行性,并保持自身繁忙,仅在吞吐量上存在瓶颈。

  •  类似资料:
    • 问题内容: 我为Apache Flink写了一个非常简单的Java程序,现在我对测量统计信息感兴趣,例如吞吐量(每秒处理的元组数)和等待时间(程序需要处理每个输入元组的时间)。 我知道Flink公开了一些指标: https://ci.apache.org/projects/flink/flink-docs- release-1.2/monitoring/metrics.html 但是我不确定如何使

    • 我正在尝试运行Flink流媒体作业。我想确定流处理的延迟和吞吐量。我已启动Kafka代理服务器,并收到来自Kafka的传入消息。如何计算每秒的邮件数(吞吐量)?(如rdd.count。是否有类似的方法来获取传入消息的计数) (完整的场景:我已经通过生产者发送了消息作为Json对象。我在Json对象中添加了一些信息,如名称为字符串和System.currentTimeMills。在流式传输期间,我如

    • 在大数据存储中,IOPS和吞吐量之间的关键区别是什么

    • 我找不到任何关于agner.orgRDRAND指令的延迟或吞吐量的信息。但是,这个处理器存在,所以信息必须在那里。 编辑:实际上,最新的优化手册中提到了此说明。记录如下:

    • 我正在开发一个具有以下特性的实时应用程序: 数百个客户端将同时插入行/文档,每个客户端每隔几秒钟插入一行。 大部分仅追加;几乎所有的行/文档,一旦插入,永远不会改变。 只有当数据被刷新到磁盘时,客户端才会看到成功,此后读写一致性应该保持不变。 客户端愿意等待几秒钟的确认时间足够多的磁盘查找和写入发生。 RAM中的数据太多(排除像Redis这样的选项)。但是写很久以前的行很少被访问,所以在内存中没有

    • 我是Kafka的新手,正在运行一些性能测试。我正在运行一个由我的笔记本电脑和一个raspberry pi zero W(1 GHz、单核CPU、512 MB RAM、802.11n无线局域网)组成的2台机器集群。最终,pi将运行一个单独的生成器(java),该生成器将二进制传感器数据(理想情况下是更小的记录,例如,10 kb,以最快的速度)发送给kafka,然后由消费者在我的笔记本电脑或另一个pi