我正在运行一个基准测试来测量网络设备的带宽(与 PCIE 连接)。 基准测试使用通信框架来传输消息。 每个发送操作都由发送请求表示。
发送方和接收方具有相同的设置,具有相同的 CPU/RAM/网卡/OS/SW/驱动程序/等 测试在每个对等点的单核上运行,只有一个线程(一个在发送方,一个在接收方)。 测试有一个预热阶段(不测量执行的结果)。 进程根据系统拓扑(NUMA 距离)固定到特定核心。
我注意到,与基于 Intel 的机器相比,我在基于 AMD 的机器上得到了不同的结果。这是预料之中的,但奇怪的是 AMD CPU (EPYC 7443) 应该比英特尔 (E5-2680 v4) 更快,但基于英特尔的系统提供了 20% 的带宽。
我计算了两个系统(在发送方)上的缓存未命中率,与 Intel 机器相比,AMD 机器上的缓存未命中率很高。我不确定为什么会这样。
AMD
Performance counter stats for process id '1103957':
**4,064,775,312 cache-references (41.65%)
293,339,910 cache-misses # 7.217 % of all cache refs** (41.65%)
2,773,241,736 L1-dcache-load-misses (41.65%)
1,105,886 L1-icache-load-misses (41.66%)
97,199,735,971 cpu-cycles (41.67%)
138,263 r8ae (41.68%)
60,775,752,753 r4ae (41.68%)
2,044,760,199 r2ae (41.68%)
2,012 r1ae (41.68%)
16,147,477 r187 (41.68%)
179,557,410 r287 (41.67%)
76,295,394,278 r487 (41.66%)
25.000407397 seconds time elapsed
Intel
Performance counter stats for process id '109233':
**2,025,418,233 cache-references
362,591 cache-misses # 0.018 % of all cache refs**
2,967,129,952 L1-dcache-load-misses
12,114,610 L1-icache-load-misses
77,263,379,357 cycles
26,532,945,498 resource_stalls.any
10,038,121,055 resource_stalls.sb
25.297898440 seconds time elapsed
内存占用也不同: 英特尔 总计 626452K AMD 总计 469760K
我还在发送端测量了每个请求(使用
clock()
)的生命周期(从创建到完成),我得到了一些我不确定如何解释的奇怪结果。我附上了一张包含 5000 个采样请求的图表。也许值得一提的是,当设备“资源不足”时,请求可以进入待处理队列,并且该队列是在 SW 中实现的。
似乎 CPU 的工作方式不同。我知道 CPU 的体系结构存在差异(英特尔是单片的),可能还有其他差异可以解释这种奇怪的结果,但我不是 CPU 架构师或编译器专家,所以我不能确切地说出我是什么看到以及为什么我得到这个结果。如果您能帮助我并向我解释可能导致这种情况的原因以及可以改进的地方? 另外我不明白为什么英特尔机器上的大量请求显示 0 周期生命周期,这是测量错误吗?