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

Ivy桥上RDRAND指令的延迟和吞吐量是多少?

太叔景同
2023-03-14

我找不到任何关于agner.orgRDRAND指令的延迟或吞吐量的信息。但是,这个处理器存在,所以信息必须在那里。

编辑:实际上,最新的优化手册中提到了此说明。记录如下:

共有3个答案

湛骏祥
2023-03-14

我使用Intel的“librdrand”包装器在一个实际的常春藤网桥i7-3770上做了一些初步的吞吐量测试,它在一个内核上每秒生成3300-3500万个32位数字。

这个来自英特尔的7000万数字大约是8核;其中一个报告只有10米左右,所以我的测试比其他测试好3倍多:-/

邓阳炎
2023-03-14

您可以在英特尔数字随机数生成器(DRNG)软件实施指南中找到一些相关信息。

逐字引用如下:

实测吞吐量:

Up to 70 million RDRAND invocations per second
500+ million bytes of random data per second
Throughput ceiling is insensitive to the number of contending parallel threads
贲文景
2023-03-14

我写了《利伯兰德》。使用RdRand指令用随机数填充缓冲区是一组非常基本的例程。

我们在IDF上展示的性能数据来自我编写的测试软件,该软件在Linux中使用pthreads生成了许多线程。每个线程使用RdRand用随机数填充内存缓冲区。该程序测量平均速度,可以在改变线程数的同时进行迭代。

由于每个核心到共享DRNG的往返通信延迟比在DRNG上生成随机数所需的时间要长,因此平均性能会随着线程的添加而明显提高,直到达到最大吞吐量。IVB上DRNG的物理最大吞吐量为800MBytes/s。一个具有8个线程的4核IVB可以管理780Mbytes/s左右的数据。线程和内核越少,所获得的数据就越少。500MB/s的数字有些保守,但当您试图诚实地宣称性能时,您必须做到这一点。

由于DRNG以固定频率(800MHz)运行,而核心频率可能会有所不同,因此每个RdRand的核心时钟周期数会有所不同,具体取决于核心频率和同时访问DRNG的其他核心的数量。IDF演示文稿中给出的曲线是预期的现实表示。总性能受核心时钟频率的影响较小,但影响不大。线程数量是主要因素。

在测量RdRand性能以实际“使用”RdRand结果时应该小心。如果你没有,即你这样做了... RdRand R6, RdRand R6,......, RdRand R6重复多次,性能会被人为地读取为高。由于数据在被覆盖之前不会使用,因此CPU管道不会等待数据从DRNG返回,然后再发出下一条指令。我们编写的测试将结果数据写入内存,这些内存将在片上缓存中,因此管道会停止等待数据。这也是为什么RdRand的超线程比其他类型的代码更有效的原因。

IDF幻灯片中给出了特定平台、时钟速度、Linux版本和GCC版本的详细信息。我记不清脑子里的数字了。有的芯片速度较慢,有的芯片速度较快。我们给的号码

这些芯片现在已经上市,因此任何精通rdtsc的人都可以进行同样的测试。

 类似资料:
  • 问题内容: 我为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。在流式传输期间,我如

  • 总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解。但是,对于Intel Intrinsics,延迟对指令吞吐量的影响我还不清楚,尤其是在顺序(或几乎顺序)使用多个内在调用时。 例如,让我们考虑: 这有11个延迟,在Haswell处理器上的吞吐量为7。如果我在循环中运行这条指令,我会在11个循环后获得每个循环的连续输出吗?由于这需要一次运行11条指令,并且由于我的吞吐量为7,我是否用完了“执行

  • 我正在寻找一种公式/方法来衡量一条指令的速度,或者更具体地说,按CPU周期给每条指令一个“分数”。 以下面的汇编程序为例, 以及以下Intel Skylake信息: mov r,m:吞吐量=0.5延迟=2 Mov m, r:吞吐量=1延迟=2 nop:吞吐量=0.25延迟=非 inc:吞吐量=0.25延迟=1 我知道程序中的指令顺序在这里很重要,但我希望创建一些不需要“精确到单个周期”的通用指令

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

  • 无论从什么角度来看,它都不是。 假设我有两个消费者,它们以每秒“10”条消息的速度从给定主题中消耗数据。现在,不管它们是从单个分区还是从两个不同的分区进行消耗;我的吞吐量将保持不变,每秒20条消息。 我觉得我一定漏了一些内部工作的细节,你能帮我解释一下kafka分区(多个)是如何帮助提高固定用户数量的吞吐量的,而不是单个kafka分区。